Как корректно заменить в тексте тестовые URLы на ссылки?

Solmyr
На сайте с 10.09.2007
Offline
501
717

То есть если в тексте есть фрагмент

http://google.com

он заменился на фрагмент

<a href="http://google.com">http://google.com</a>

Но если в тексте уже есть фрагмент

<a href="http://google.com">гугль</a>
или
<a href="http://google.com">http://google.com</a>

То его бы не тронуло и оставило без изменений как есть. То есть не заменять тестовый URL на <a href если этот URL находится внутри тега <a> (то ли в href то ли в тексте анкора)

[Удален]
#1

notepad++ с регулярными выражениями такое умеет

Solmyr
На сайте с 10.09.2007
Offline
501
#2
JackRassell:
notepad++ с регулярными выражениями такое умеет

Это такой модуль апача или библиотека php?

PN
На сайте с 22.08.2012
Offline
103
#3
Solmyr:
То есть если в тексте есть фрагмент
http://google.com

он заменился на фрагмент
<a href="http://google.com">http://google.com</a>

Но если в тексте уже есть фрагмент
<a href="http://google.com">гугль</a>

или
<a href="http://google.com">http://google.com</a>

То его бы не тронуло и оставило без изменений как есть. То есть не заменять тестовый URL на <a href если этот URL находится внутри тега <a> (то ли в href то ли в тексте анкора)

это делается регулярными выражениями

Мой совет помог? Не скупись! Bitcoin 1Lseddet1o1B6odgXQHbGaWGwRkt1Db8Ef Ethereum 0x450f1a17461e25194B7F9226cDEe70173F39e1e1
Solmyr
На сайте с 10.09.2007
Offline
501
#4
proksey-net:
это делается регулярными выражениями

А как добиться чтобы регулярные выражения не работали внутри тега <a> ?

PN
На сайте с 22.08.2012
Offline
103
#5
Solmyr:
А как добиться чтобы регулярные выражения не работали внутри тега <a> ?

вот так (потратил 2 часа, чтобы придумать):


$text = preg_replace('/(!(<a.*)|(<\/a>.*)|\s)(http:\/\/[\w\.\-\_%]*)/', '$1<a href = "$4">$4</a>', $text);
Solmyr
На сайте с 10.09.2007
Offline
501
#6

proksey-net, Спасибо огромное, действительно работает, только вот тут [\w\.\-\_%] перечень символов нужно подправить кому как надо. Как минимум \/ добавить, а еще вообще-то и \?& но мне например это не надо.

---------- Добавлено 13.04.2015 в 08:07 ----------

Ага. Только вот такой момент, если ссылка которую нужно заменить, находится между двумя тегами <a>, то она не будет заменена, например во фрагменте текста:


word <a href="http://site1.ru">site1.ru</a> word http://site3.ru word word <a href="http://site2.ru">site2.ru</a>

Фрагмент текста http://site3.ru не будет заменен на ссылку.

Я думаю, может текст надо как-то в два прохода обрабатывать (или в три). Сначала все ссылки <a href> в спецметки, потом текст http:// в спецметки, а потом спецметки в <a href>

---------- Добавлено 13.04.2015 в 09:01 ----------

Ну в общем я остановился на таком коде:


$html = preg_replace('/\[A\]([a-z0-9=+\/]+)\[\/A\]/uis','',$html);
$html = preg_replace_callback('/<a[^>]*>[^<]*?<\/a>/uis',function($mt){return '[A]'.base64_encode($mt[0]).'[/A]';},$html);
$html = preg_replace_callback('/http:\/\/[\w\.\-\_\/%]*/uis',function($mt){return '[A]'.base64_encode('<a href="'.$mt[0].'">'.$mt[0].'</a>').'[/A]';},$html);
$html = preg_replace_callback('/\[A\]([a-z0-9=+\/]+)\[\/A\]/uis',function($mt){return base64_decode($mt[1]);},$html);

J
На сайте с 20.02.2014
Offline
120
jkm
#7
Solmyr:
если ссылка которую нужно заменить, находится между двумя тегами <a>, то она не будет заменена, например во фрагменте текста:


word <a href="http://site1.ru">site1.ru</a> word http://site3.ru word word <a href="http://site2.ru">site2.ru</a>


Фрагмент текста http://site3.ru не будет заменен на ссылку.

Это последствия применения <\/a>.* которая захватит максимально любых символов до конца строки.

Можно поправить выкинув из шаблона все лишнее оставив только (\s)(http:\/\/[\w\.\-\_%]*)

Но не сработает если ссылка в начале текста или обернута в другой тег <span>http://site3.ru</span>.

Решить можно так:


$html = preg_replace('~
\G
(
(?:
[^h<]+
|
<a.*?</a>
|
(?!(?2)).
)*+
)
(http://[-._%/\w]*)~ix',
'\1<a href="\2">\2</a>',
$html
);

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий