Регулярка преобразование пасивных ссылок в активные

ajrengen

Мастер
Регистрация
28 Сен 2008
Сообщения
122
Реакции
33
Здравствуйте,

При вводе комментариев нужно пасивные ссылки типа Для просмотра ссылки Войди или Зарегистрируйся преобразовать в активные
HTML:
<a href="http://www.acmodasi.ru">http://www.acmodasi.ru</a>
При этом надо учесть что могут быть добавлены теги вставки видео, например с ютуба вида
HTML:
<iframe src="http://www.youtube.com"></iframe>
в этих тегах ссылки заменятся, естественно, не должны.
Нашёл такую конструкцию
PHP:
preg_replace("#(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);

Но она заменяет все ссылки в том числе в тегах. Как сделать что бы линки в тегах она не преобразовывала?
Спасибо.
 
Как вариант можно использовать strip_tags, с указанием разрешенных тэгов, а потом пропустить через твою регулярку.
 
PHP:
foreach(preg_split('#(<a[^>]+>.+?</a>)#is',$text,-1,1|2) as $part) // разделяем анкоры и html
$res_text.= stristr($part,'<a') ? $part : preg_replace("#(?<=[^\"'=])(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
   "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$part);

условие предшествующего текста (?<=[^\"'=]) пропускает атрибуты
 
Для просмотра ссылки Войди или Зарегистрируйся
Так и делаю, среди оставшихся тегов после strip_tags есть iframe и object и img в них содержится ссылка src="", которая также заменится на редирект, а значит будет неработоспособной.

Для просмотра ссылки Войди или Зарегистрируйся
Не работает, чего-то не хватает. Теги в принципе пропускает, но ссылки вне тегов активными не делает. Тег <a> вырезается stip_tags его не надо обрабатывать отдельно.
 
Давайте по другому, надо определить начинается ли http как первый символ строки, есть ли перед ней пробел, знак табуляции или перенос строки.
Вот готовая регулярка:
PHP:
$res_text = preg_replace("#(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);
 
PHP:
preg_replace("#(?<=^|\s)(https?|ftp)://\S+[^\s.,> )\];'\"!?]#",
    "<a href=\"{$site_http}index.php?action=link&url=\\0\">\\0</a>",$text);

^ начало текста. \s пробел, tab, перенос
 
Для просмотра ссылки Войди или Зарегистрируйся
В целом заработало, но не обрабатываются переносы строки. То есть если ссылка с новой строки то она остаётся пассивной.
Код:
http://www.acmodasi.ru - активная, в начале текста.
http://www.acmodasi.ru - пассивная с переносом строки
http://www.acmodasi.ru - пассивная с переносом строки
 
вероятно скрипт заменяет переносы на <br>
тогда первое условие
Код:
(?<=^|\s|br>|br/>)
 
Да, действительно, так и было, ещё раз спасибо.
 
Назад
Сверху