関数索引
find() 関数は、文字列中の特定のパターンを検索します。パターンは正規表現で指定します。
find() 関数の戻り値は、見つかったパターンの列です。例えば、文字列中に該当するパターンが3箇所見つかった場合、find() 関数の戻り値は長さ3の列になります。列中には、文字列中に見つかった該当パターンが、見つかった順に格納されています。
text という要素名の複数行文字列の要素があるとします。この text のに含まれている、メールアドレスと思われるパターンを find() 関数で拾いだし、それを、対応する実体参照形式に変換してみます。
<wr-variable
name="address"
value="find(text, \"[a-zA-Z0-9._-]+@[a-zA-Z0-9.-_]+\")" />
<wr-variable name="tmp" value="text" />
<wr-for list="address" variable="x">
<wr-variable
name="tmp"
value="replaceFirst(tmp, x, toEntityRef(x))" />
</wr-for>
<p>%tmp%</p>
この例では replaceFirst() 関数が使われています。ここで replaceAll() 関数を使うと意図しない結果となってしまう場合があるので注意が必要です。
find() 関数で見つけ出したパターンをひとつずつ、toEntityRef() 関数で実体参照形式に変換したものに置き換えるのですが、例えば、find() の結果、abc と abcd が得られた場合、replaceAll() 関数で置き換えを行なってしまうと、すべての abc が abc に置き換えられてしまうため、abcd の部分が abcd に置き換わってしまいます。その結果 abcd の abcamp;100; への置き換えが失敗に終わってしまいます。
サンプルコード中のメールアドレスの検出パターンは十分なものではありません。実際には、もう少し洗練されたものが必要かもしれません。