PHP7.2 preg_replace():为什么此正则表达式会生成警告?
PHP7.2 preg_replace(): Why is this regex generating a warning?
我正在从 PHP5.x 迁移到 PHP 7.2,我的 link 转换器功能的一部分正在生成警告:
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 修饰符,所以我无法弄清楚导致问题的原因。
这里的 e 修饰符是无用的,因为 preg_replace
没有引用替换参数中的任何函数。你可以这样写:
$ret = preg_replace('#(?<!\S)\w+://\w+[^"\s<]*#', '<a class="offsite" href="[=10=]" target="_blank" rel="nofollow">[=10=]</a>', $ret);
$ret = preg_replace('#(?<!\S)(?:www|ftp)\.[^"\s<]*#i', '<a class="offsite" href="http://[=10=]" target="_blank" rel="nofollow">[=10=]</a>', $ret);
$ret = preg_replace('#(?<!\S)[\w&.-]+@(?:[\w-]+\.)+\w+#', '<a class="offsite" href="mailto:[=10=]">[=10=]</a>', $ret);
我正在从 PHP5.x 迁移到 PHP 7.2,我的 link 转换器功能的一部分正在生成警告:
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 修饰符,所以我无法弄清楚导致问题的原因。
这里的 e 修饰符是无用的,因为 preg_replace
没有引用替换参数中的任何函数。你可以这样写:
$ret = preg_replace('#(?<!\S)\w+://\w+[^"\s<]*#', '<a class="offsite" href="[=10=]" target="_blank" rel="nofollow">[=10=]</a>', $ret);
$ret = preg_replace('#(?<!\S)(?:www|ftp)\.[^"\s<]*#i', '<a class="offsite" href="http://[=10=]" target="_blank" rel="nofollow">[=10=]</a>', $ret);
$ret = preg_replace('#(?<!\S)[\w&.-]+@(?:[\w-]+\.)+\w+#', '<a class="offsite" href="mailto:[=10=]">[=10=]</a>', $ret);