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 回答