[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: замена url на "a href" помогите доделать
Snake22
понадобилась регулярка для замены ссылок вида http://site.ru или www.site.ru на кликабельную ссылку вида <a href...>
сам я в регулярках плохо шарю и поэтому решил первым делом поискать готовые решения.
но почти все они с косяками,например ни в одном примере почему то не нашел такую регулярку которая бы НЕ заменяла текст в уже сформированной <a href ссылке. (не отрицаю что мог плохо искать!)

отчаявшись начал изучать регулярки сам, кое как написал почти рабочий вариант (кстати процесс изучения то интересный оказался),но он мне в начало ссылки вставляет символ переноса. никак не знаю как его убрать оттуда.
то есть например ссылку http://site.ru моё выражение заменит на
<a href=" http://site.ru">http://site.ru</a> (обратить внимание тут типа перенос сразу после кавычки href=" http )
вот мой код:

<?php
// текст ссылок
$text='http://site1.ru <br>
www.site2.ru <br>
<a href="http://site3.ru" target=_blank>site3.ru</a> (в этой строчке ничего заменятся не должно так как изначально кликабельная ссылка)
'
;
//текст ссылок END


//заменяем все http:// ссылки

$text = preg_replace("#(\s|^)http://[^\s\[<]+#i",
"<a href=\"$0\" target=_blank><u>\$0</u></a>",
(
stripslashes($text)));

//заменяем оставшиеся www ссылки, которые без http://
$text = preg_replace("#(\s|^)www.[^\s\[<]+#i",
"<a href=\"http://$0\" target=_blank><u>\$0</u></a>",
(
stripslashes($text)));

echo $text."<br><br>";
?>
Snake22
хмм вроде получилось. всего лишь убрал \s| и оставил только ^
то есть так
$text = preg_replace("#(^)http://[^\s\[<]+#i",  
"<a href=\"$0\" target=_blank><u>\$0</u></a>",
(
stripslashes($text)));


а нет! блин! в таком случае тока заменяется если слово http:// стоит в самом начале строки.
OleKh
$text = preg_replace('#(^|[^"])((?:www|http)[^\s]+\.\w\w)#i',
"<a href=\"$0\" target=_blank><u>\$0</u></a>",
(
stripslashes($text)));
Snake22
OleKh спасибо. только всё равно в результатирующей ссылке перенос вставляется.
вот такой пример текста

$text='http://site1.ru <br>
http://site2.ru <br>
www.site3.ru <br>
<a href="http://site4.ru" target=_blank>site4.ru</a> (в этой строчке ничего заменятся не должно так как изначально кликабельная ссылка)
'
;

то есть первая ссылка,которая начинается с начала строки,заменилась нормально без переноса.а в остальные строки вставился перенос.

вот бы как нить к $0 применить trim
OleKh
Цитата (Snake22 @ 12.04.2013 - 11:09)
перенос вставляется

<br> - есть в исходном тексте
Snake22
Цитата (OleKh @ 12.04.2013 - 12:13)
<br> - есть  в исходном тексте

но если строка будет такой
$text='http://site1.ru http://site2.ru';
то вместо переноса вставится пробел в ссылку ,то есть
<a href="_http://site2.ru"
результат как то тримнуть надо
OleKh
Цитата (Snake22 @ 12.04.2013 - 11:15)
вставится пробел в ссылку

Ничего не вставится.

Находится строка соответствующая шаблону, в данном случае http://site1.ru и заменяется на
<a href=\" http://site1.ru\" target=_blank><u>http://site1.ru</u></a>. Остальное остается без изменений.

Snake22
странно sad.gif у меня пробел вставляется.
код естественно целиком ваш скопировал.
я даже наверное понимаю почему, то есть мы задаём условие искать слово http перед которым стоит пробельный символ, и в итоге это слово берётся вместе с пробельным сиволом.
вот посмотрите скрин, красненьким выделил пробел.
но при этом в первой ссылке пробела нет так как его нет перед словом http, потому что слово идёт первым в тексте.

http://i1.imageban.ru/out/2013/04/12/4e08b...66025b0ab59.jpg
OleKh
$text = preg_replace('#(^|[^"])((?:www|http)[^\s]+\.\w\w)#i',
"<a href=\"$2\" target=_blank><u>\$2</u></a>",
(
stripslashes($text)));


Цитата
даже наверное понимаю почему, то есть мы задаём условие искать слово http перед которым стоит пробельный символ

перед которым может быть любой символ кроме ", чтобы исключить href=""
Snake22
OleKh о,спасибо! теперь кажется норм работает.
правда пробел теперь совсем сжирается но ниче это я и ручками подставить смогу biggrin.gif
OleKh
Пожалуйста.
Цитата (Snake22 @ 12.04.2013 - 12:05)
пробел теперь совсем сжирается

Где? Не понятно.
Snake22
Цитата (OleKh @ 12.04.2013 - 13:08)

Где? Не понятно.

между двумя ссылками
$text='http://site1.ru http://site2.ru';
ну эт фигня))всё нормально

<a href="http://site1.ru" target=_blank><u>http://site1.ru</u></a>ТУТ_ИСЧЕЗАЕТ_ПРОБЕЛ<a href="http://site2.ru" target=_blank><u>http://site2.ru</u></a><br><br>
OleKh
Цитата (Snake22 @ 12.04.2013 - 12:20)
между двумя ссылками

<u>\$2</u></a> "

Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.