0

文字列内のすべての RegEx 一致を検索し、作成した関数を使用してそれらすべての一致を実行する方法を考え出そうとしていますが、うまくいきません。

具体的には、文字列内のすべての電子メール アドレスを検索し、関数を使用してそれらのアドレスを便利な mailto リンクに変換し、スパム ボットからアドレスを隠すようにしています。

そこで、単純な古い RegEx から始めて、アドレスを mailto リンクに変換します。これは、一致が機能していることを確認するためです。

$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i';
$replacement = "<a href='mailto:\\1'>\\1</a>";
$description = preg_replace($pattern, $replacement, $description);

よく働く。ここまでは順調ですね。しかし、関数を使用してアドレス文字列を操作しようとすると、電子メール アドレスが一致しなくなります。

$pattern = '#([0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]([-.]?[0-9a-z])*\\.[a-wyz][a-z](fo|g|l|m|mes|o|op|pa|ro|seum|t|u|v|z)?)#i';
$replacement = myFunction('\\1');
$description = preg_replace($pattern, $replacement, $description);

私は何を間違っていますか?

4

1 に答える 1

3
$description = preg_replace_callback($pattern, 'myFunction', $description);

preg_replace_callback()マニュアルを確認して、それがどのように機能するかを理解してください。

関数は次のmyFunction()ようにコーディングする必要があります。

function myFunction($matches)
{
    return sprintf('<a href="mailto:%s">%s</a>', $matches[1], $matches[1]);
}

クロージャーでの使用preg_replace_callback()(PHP 5.3+):

$description = preg_replace_callback($pattern, function ($matches) {
    return myFunction($matches[1]);
}, $description);
于 2013-11-10T04:33:41.503 に答える