[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Условия для несрабатывания регулярки
FatCat
Есть готовая регулярка, ищет строки, начинающиеся на "www" и преобразует в гиперссылку:
$row['post'] = preg_replace( "#(\040|>)(www\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\<]*)?)#is"     , "\\1<a href='http://\\2'>\\2</a>"  , $row['post'] );


Есть проблема: регулярка срабатывает и внутри гиперссылок. В результате код
<a href="http://site.ru/">www.other.com</a>
предвращается регуляркой в гиперссылку не туда...

Возникла мысль добавить проверку на наличие закрывающего тега </a>, но не могу составить условие.
Гуглил, с символом "не" какая-то засада: он есть, это "^", но работает только внутри квадратных скобок.
Пробовал вывернуться паттерном
#(\040|>)(www\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\<]*)?)[^(</a>)]#
- ни фига...

Что-то я завяз, никаких идей...



Спустя 52 минуты, 33 секунды (24.02.2010 - 23:00) John_761 написал(а):
А если воспользоваться функцией preg_split() ?
она работает как explode(), только параметром служит регулярка
И получится массив без гиперссылок, правда выходит больше лишних действий unsure.gif

Спустя 13 минут, 41 секунда (24.02.2010 - 23:14) FatCat написал(а):
Хочу освоить регулярки.
Поиски/замены неплохо умею делать и без регулярок посредством substr(), strpos() и stristr(), и тут могу ими сделать. Вопрос не в том, как сделать замену, а как сделать замену регуляркой...

Спустя 28 минут, 2 секунды (24.02.2010 - 23:42) DedMorozzz написал(а):
а разве не так ^(<\/a>)

Спустя 27 минут, 32 секунды (25.02.2010 - 00:09) TakoY написал(а):
^ это значит "все кроме"
здесь помойму нужно использовать
(?!шаблон) Негативный просмотр вперёд (с отрицанием)
(?<!шаблон) Негативный просмотр назад (с отрицанием)
меня этот вопрос тоже интересует

Спустя 13 минут, 54 секунды (25.02.2010 - 00:23) FatCat написал(а):
(?!<\/a>) и (?!</a>) не срабатывают - внутри гиперлинка продолжает заменять.
Почему-то срабатывает вот такое:
"#(\040|>)(www\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\<]*)?)(\040|>)#is"


(\040|>) - что это вообще значит?

Спустя 16 часов, 58 минут, 19 секунд (25.02.2010 - 17:21) FatCat написал(а):
Разобрался.
$row['post'] = preg_replace( "#(\040|>)(www\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\<]*)?)\040#is"     , "\\1<a href='http://\\2'>\\3 "  , $row['post'] );


Не идеально, но приемлемо: заменяет только при условии концевого пробела.


_____________
Бесплатному сыру в дырки не заглядывают...
Быстрый ответ:

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