Регулярные выражение. Негативный просмотр назад
Непонятно, с какой частью выражения связан негативынй просмотр назад. И почему тут не используется негативный просмотр вперед?
preg_replace_callback(
'{
(?:
(\w+://) # протокол с двумя слэшами
| # - или -
www\. # просто начинается на www
)
[\w-]+(\.[\w-]+)* # имя хоста
(?: : \d+)? # порт (не обязателен)
[^<>"\'()\[\]\s]* # URI (но БЕЗ кавычек и скобок)
(?: # последний символ должен быть...
(?<! [[:punct:]] ) # НЕ пунктуацией
| (?<= [-/&+*] ) # но допустимо окончание на -/&+*
)
}xis',
function ($p) {
$name = htmlspecialchars($p[0]);
$href = !empty($p[1])? $name : "http://$name";
return "<a href=\"$href\">$name</a>";
},
$text
);
Ответы (1 шт):
Просмотр назад связан с последующим, не указанным в выражении, элементом, возможно нулевой ширины. И служит что бы заглянуть назад внутрь пройденной строки и провести дополнительную проверку последнего символа, внутри хоста, порта или URI, смотря что будет присутствовать в строке.
А просмотр вперед не сработает. Скажем возьмем url http://abc.com:999/xxx.php? вопросительный знак в нем будет захвачен выражением URI. При этом негативный просмотр вперед будет пытаться убедиться, что после него нет например еще одного вопросительного знака. И он успешно с этим справится, в итоге, вопросительный знак не будет отрезан от URI