PHP7.2 preg_replace():为什么这个正则表达式产生警告?

时间:2018-05-20 18:54:54

标签: regex preg-replace php-7.2

我正在从PHP5.x迁移到PHP 7.2并且部分链接转换器功能正在生成警告:

Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

以下是触发警告的功能:

function linkify($str) {
    $ret = ' ' . $str;
    $ret = preg_replace("#(^|[\n ])([\w]+?://[\w]+[^ \"\n\r\t<]*)#ise", "'\\1<a class=\"offsite\" href=\"\\2\" target=\"_blank\" rel=\"nofollow\" >\\2</a>'", $ret);
    $ret = preg_replace("#(^|[\n ])((www|ftp)\.[^ \"\t\n\r<]*)#ise", "'\\1<a class=\"offsite\" href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\" >\\2</a>'", $ret);
    $ret = preg_replace("#(^|[\n ])([a-z0-9&\-_\.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a class=\"offsite\" href=\"mailto:\\2@\\3\">\\2@\\3</a>", $ret);
    $ret = substr($ret, 1);
    return($ret);
}

我得到2个相同的警告,一个用于第一个preg_replace,另一个用于第二个。不知怎的,第三个人没有发出警告。

除非我失明,否则它没有使用/ e修饰符,所以我无法弄清楚导致问题的原因。

1 个答案:

答案 0 :(得分:2)

这里e修饰符没用,因为preg_replace没有引用替换参数中的任何函数。你可以写:

$ret = preg_replace('#(?<!\S)\w+://\w+[^"\s<]*#', '<a class="offsite" href="$0" target="_blank" rel="nofollow">$0</a>', $ret);
$ret = preg_replace('#(?<!\S)(?:www|ftp)\.[^"\s<]*#i', '<a class="offsite" href="http://$0" target="_blank" rel="nofollow">$0</a>', $ret);
$ret = preg_replace('#(?<!\S)[\w&.-]+@(?:[\w-]+\.)+\w+#', '<a class="offsite" href="mailto:$0">$0</a>', $ret);