Auto parse URLs - регулярка

mp3sova

Постоялец
Регистрация
14 Мар 2012
Сообщения
71
Реакции
28
Код:
$txt = preg_replace( "#(^|\s)((http|https|news|ftp)://\w+[^\s\[\]]+)#ie"  , "\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))", $txt );

Не пойму, каким образом заставить преобразовывать ссылки
вида _http:// ->http:// или такого плана текстцифрыhttp:// в активные.

надо наверное немного видоизменить:
Код:
$txt = preg_replace( "#(^|\s|)

только не пойму как сделать правильно?
 
видоизменил до такой степени:
Код:
$txt = preg_replace( "#(^|\s|[\)\(\*\|\/\{\}\,\.\[\:\?\№\"\!\`\@\%\~\^\;\+\#_a-zа-я0-9\-\]]|\]\s\=|\]\=|\s\=)((http|https|news|ftp)://\w+[^\s\[\]]+)#ie"  , "\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))", $txt );
Заработало как почти хотелось, но вылез баг, ссылки стали активными и в тэге
Код:
[img][/img]
где их как бы трогать не надо, а вот в
Код:
[b][i]
замена как раз актуальна.

пытался как-то исключить по расширению .jpg или по [/img], не получается найти нужную комбинацию :)
 
Фрагмент (^|\s|) можно совсем убрать и поправить номера обратных ссылок в строке замены.
array('html' => '\\1', 'show' => '\\1', 'st' => '')

Пропуск содержимого тегов img поможет сделать (*SKIP)(*F), если конечно версия PHP не слишком древняя Для просмотра ссылки Войди или Зарегистрируйся
PHP:
$txt = preg_replace( '#\[img.*?\[/img\](*SKIP)(*F)|((https?|news|ftp)://\w+[^\s\[\]]+)#ise', "\$this->regex_build_url(array('html' => '\\1', 'show' => '\\1', 'st' => ''))", $txt );
 
php 5.2.17

Скрипт теперь отдаёт:
Код:
<span style="color:#3366FF">-&gt;<a href="<a href=" http:="" redirect.net="" go.php?go="http://localhost/forum-test/index.php?showforum=3''" target="_blank">http://redirect.net/...p?showforum=3'</a> target='_blank'&gt;<a href="http://redirect.net/go.php?go=http://localhost/foru...hp?showforum=3</a></span>" target="_blank">http://localhost/foru...m=3</a></span>

а должен:
Код:
<span style="color:#3366FF">-&gt;<a href="http://redirect.net/go.php?go=http://localhost/forum-test/index.php?showforum=3" target="_blank">http://localhost/foru...hp?showforum=3</a></span>

Выходит что-то не то залетает в regex_build_url?
 
По виду похоже что регулярку поменяли, а строку замены оставили старую
Код:
"\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))"
В новой регулярке удалена одна сохраняющая группа (^|\s|) и нужно поменять номера обратных ссылок.
Новая строка замены должна быть такая:
Код:
"\$this->regex_build_url(array('html' => '\\1', 'show' => '\\1', 'st' => ''))"
 
да, это вывод как раз с
Код:
"\$this->regex_build_url(array('html' => '\\1', 'show' => '\\1', 'st' => ''))"

применил (*SKIP)(*F) "на своём коде"
Код:
$txt = preg_replace( "#(^|\s|[\)\(\*\|\/\{\}\,\.\[\:\?\№\"\!\`\@\%\~\^\;\+\#_a-zа-я0-9\-\]]|\]\s\=|\]\=|\s\=|\[img.*?\[/img\](*SKIP)(*F))((http|https|news|ftp)://\w+[^\s\[\]]+)#ise"  , "\$this->regex_build_url(array('html' => '\\2', 'show' => '\\2', 'st' => '\\1'))", $txt );

и всё что в тегах img перестало правильно парсится:
Код:
<img src=" <a href=" http:="" redirect.net="" go.php?go="http://nullrd.ws/images/server3/out.php/i50530_dr.png''" target="_blank">http://nullrd.ws/imag...i50530_dr.png' border='0' alt='' /&gt;

так должно быть:
Код:
<img src="http://nullrd.ws/images/server3/out.php/i50530_dr.png" alt="" border="0">
 
Тогда для отладки нужен пример текста который парсиш и содержимое функции regex_build_url.
 
Назад
Сверху