Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: ссылки
 
 автор: afdm   (16.01.2008 в 20:39)   письмо автору
 
 

Здравствуйте!
Задача такая: требуется подсветить ссылки вида
http://www.yandex.ru | http://yandex.ru | www.yandex.ru | yandex.ru
делаю так:

"/(http:\/\/|)(\S+)/i";

заменяю на

<a href="http://\\2">\\2</a>

но при этом заменяются и ссылки в [url][/url] :(((

пробую как-то так:
"/(^[url=http:\/\/|www)(\S+)[\/url]/i"

понимаю что это полная чушь, а как исправить никак не догадываюсь (((
помогите, пожалуйста... спасибо! :)))

   
 
 автор: afdm   (17.01.2008 в 12:36)   письмо автору
 
   для: afdm   (16.01.2008 в 20:39)
 

никто не поможет??? :(((

   
 
 автор: Loki   (17.01.2008 в 13:03)   письмо автору
 
   для: afdm   (17.01.2008 в 12:36)
 

давайте лучше пример текста. А то я не очень понял задачу.

   
 
 автор: afdm   (17.01.2008 в 14:31)   письмо автору
 
   для: Loki   (17.01.2008 в 13:03)
 

ну вот например смотрите:
есть текст, в котором есть ссылки на http://www.yandex.ru, например. Или вот такие http://yandex.ru (без www), ну или такие www.yandex.ru (без протокола).
А ещё есть bb-коды: [url][/url]. В них тоже могут быть вот такие вот ссылки [url] www.yandex.ru [/url] например.
В результате должно получиться вот что:
есть текст, в котором есть ссылки на http://www.yandex.ru, например. Или вот такие http://yandex.ru (без www), ну или такие [url]www.yandex.ru[/url] (без протокола).
А ещё есть bb-коды: [url][/url]. В них тоже могут быть вот такие вот ссылки [url]www.yandex.ru[/url] например.

Т.е. все ссылки должны автоматически подсветиться.

Но вышеприведенный код не работает должным образом, т.к. кроме обычнх ссылок в тексте, подсвечивается содержимое bb-url-тэгов :(((

PS кстати, как посоветуете исправить след. рег. выражение на предмет безопасности?

    $search = array("/\[url=(['\"]?)(www\.)([^\"']*)\\1](.*)\[\/url\]/siU",
                    "/\[url=(['\"]?)([^\"']*)\\1](.*)\[\/url\]/siU",
                    "/\[url](www\.)([^\"]*)\[\/url\]/siU",
                    "/\[url]([^\"]*)\[\/url\]/siU",
                    "#\[b\](.*?)\[/b\]#is",
                    "#\[i\](.*?)\[/i\]#is",
                    "#\[u\](.*?)\[/u\]#is",
                    "#\[s\](.*?)\[/s\]#is");

    $replace = array("<a href=\"http://www.\\3\">\\4</a>",
                     "<a href=\"\\2\">\\3</a>",
                     "<a href=\"http://www.\\2\">\\2\\3</a>",
                     "<a href=\"\\1\">\\1</a>",
                     "<b>\\1</b>",
                     "<i>\\1</i>",
                     "<u>\\1</u>",
                     "<s>\\1</s>");

???
Заранее большое спасибо! :)))

   
 
 автор: Loki   (17.01.2008 в 15:44)   письмо автору
 
   для: afdm   (17.01.2008 в 14:31)
 

Собственно решения я вижу такое
Сначала прогнать парсинг bbcode
все обработанные url у вас находятся в кавычках: href="url" или между тегами ><
То есть надо к регулярному выражению добавить что url не может начинаться с кавычки или >. То есть либо не кавычка и не >, либо начало строки:

(^|[^>"])и далее регулярка

   
 
 автор: afdm   (17.01.2008 в 16:07)   письмо автору
 
   для: Loki   (17.01.2008 в 15:44)
 

спасибо! попробую!!! если что - напишу :)))

   
 
 автор: afdm   (17.01.2008 в 16:07)   письмо автору
 
   для: Loki   (17.01.2008 в 15:44)
 

спасибо! попробую!!! если что - напишу :)))

   
 
 автор: kasmanaft   (17.01.2008 в 17:20)   письмо автору
 
   для: Loki   (17.01.2008 в 15:44)
 

Тогда перед ссылкой после замены будет не достовать символа... который под [^>"] попадет.
Наверное надо вот так сделать: (?<![>"])и далее регулярка

PS Вместо кавычек и >, наверное, надо ] - это форум bb тег проглотил...

   
 
 автор: Loki   (17.01.2008 в 17:33)   письмо автору
 
   для: kasmanaft   (17.01.2008 в 17:20)
 

а символ который захапали перед URL надо на место вернуть:) на то он в группе и находится.

>наверное, надо ]
я первой строчкой написал, что cначала надо отпарсить bbcode. Как раз чтобы всяких значащих [] не оставалось

   
 
 автор: afdm   (17.01.2008 в 21:56)   письмо автору
 
   для: Loki   (17.01.2008 в 17:33)
 

спасибо :))) на 50% работает :(((
а если пользователь вводит ссылку вида <a href="http://www.yandex.ru">yandex</a> ???
в результате нижеприведённое выражение преобразует подобные ссылки в нечно ужасно:
<a href="http://www.ya.ru">ya.ru</a> (часть после <a href= - уже гиперссылка... :(((

как тогда исправить вот это рег выражение?
<?
"#(?<![>\"])(?<!\[url=)http://((?>[^\s\[\]]+))(?!\s*\[\/url\])#i"    
/* заменяю на */
"<a href=\"http://\\1\">http://\\1</a>"

заранее вам спасибо! :)))

   
 
 автор: kasmanaft   (18.01.2008 в 10:09)   письмо автору
 
   для: afdm   (17.01.2008 в 21:56)
 

Должно работать...

<?php

$text 
'text [ url=http://yandex.ru]yandex[/url] text [ url]http://yandex.ru[/url] text
         text http://yandex.ru text <a href="http://www.yandex.ru">yandex</a>'
;
$pattern "#(?<![>\"])(?<!\[url=)http://((?>[^\s\[\]]+))(?!\s*\[\/url\])#i";
$replacement "<a href=\"http://\\1\">http://\\1</a>";
echo 
preg_replace($pattern$replacement$text);

/* на выходе
text [ url=http://yandex.ru]yandex[/url] text [ url]http://yandex.ru[/url] text
         text <a href="http://yandex.ru">http://yandex.ru</a> text <a href="http://www.yandex.ru">yandex</a>
*/
?>

PS перед url, конечно, пробела нет.. это чтобы форум не съел бб тег.

   
 
 автор: afdm   (18.01.2008 в 14:51)   письмо автору
 
   для: kasmanaft   (18.01.2008 в 10:09)
 

спасибо, друг!!!!!!!!!!!!!!!! :)))))))))))))))))) я почти так же написал... где-то немного осталось... щас всё просмотрю :))))))))))))))
ЗЫ кстати, поздравляю!!! Скоро Ваш порядковый номер (2777) совпадёт с кол-вом сообщений (уже 2707) :))))

   
 
 автор: afdm   (18.01.2008 в 15:18)   письмо автору
 
   для: afdm   (18.01.2008 в 14:51)
 

:((( неа, всё-таки не полностью работает :(((
в обычной ссылке:

<a href="http://www.ya.ru">ya.ru</a>

после <a href=" всё остальное преобразуется в ссылку, причем очень некорректную :((((((((((
http://www.ya.ru">ya.ru</a>

   
 
 автор: kasmanaft   (18.01.2008 в 18:13)   письмо автору
 
   для: afdm   (18.01.2008 в 15:18)
 

Не может быть... покажите код.
Если в мой код вставить этот урл, работает? У меня вроде работает...

> cкоро номер совпадёт с кол-вом сообщений
Жду, не дождусь :)) Как бы не прозевать)

   
 
 автор: afdm   (18.01.2008 в 19:55)   письмо автору
 
   для: kasmanaft   (18.01.2008 в 18:13)
 

да, действительно! извините! щас разберусь :))) опять наверное где-нибудь что-нибудь забыл :))))) ещё раз извините и спасибо огромное за помощь!!!

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования