PHP7.2 preg_replace (): почему это регулярное выражение генерирует предупреждение? - PullRequest
0 голосов
/ 20 мая 2018

Я нахожусь в процессе миграции с 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 голосов
/ 20 мая 2018

Здесь модификатор 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);
...