我正试图找到一种方法来查找字符串中的所有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);
我做错了什么?
答案 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);