将PHP函数与正则表达式匹配结合使用

时间:2013-11-10 04:30:09

标签: php regex

我正试图找到一种方法来查找字符串中的所有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);

我做错了什么?

1 个答案:

答案 0 :(得分: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);