За последние 24 часа нас посетили 72283 программиста и 1653 робота. Сейчас ищут 909 программистов ...

Негативный просмотр назад с использованием .*

Тема в разделе "Регулярные выражения", создана пользователем enshtein, 10 июн 2010.

  1. enshtein

    enshtein Активный пользователь

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    есть такая регулярка:
    PHP:
    1. $pattern = '|(?<!<nospam>)<a(.*?)>(.*?)</a>(?!.*</nospam>)|i';
    задача регулярки собрать все ссылки (теги А), кроме тех которые находятся между тегами <nospam></nospam>

    все бы ничего и можно было бы использовать негативный просмотр назад и вперед для случаев когда в тексте встречаются конструкции вида:
    HTML:
    1. <nospam><a href="http://url">ccылка</a></nospam>
    но вот если внутри тегов <nospam></nospam> кроме ссылки лежат другие теги к примеру
    HTML:
    1. <nospam><p><a href="http://url">ccылка 1</a></p><table><tr><td><a href="http://url">ccылка 2</a></td></tr></table></nospam>
    то данная конструкция забирает первую ссылку..
    если регулярку изменить до такого вида
    $pattern = '|(?<!<nospam>.*)<a(.*?)>(.*?)</a>(?!.*</nospam>)|i';
    получаю в ответ:
    Warning: preg_replace_callback() [function.preg-replace-callback]: Compilation failed: lookbehind assertion is not fixed length at offset ...
    кусок регулярки (?<!<nospam>.*) - трактуемый как негативный просмотр назад с сопоставление тега <nospam> и любого кол-ва символов до встрети тега <a вызывает ошибку

    Может кто-то сталкивался с подобным? или же просто поделится опытом и знаниями )
     
  2. Щербаков Олег

    Щербаков Олег Активный пользователь

    С нами с:
    30 ноя 2008
    Сообщения:
    19
    Симпатии:
    0
    Рискну предположить что нелогично так использовать просмотры (позитивный, негативный, вперед или назад).
    Цитата из википедии
    Специализация у них как бе другая. Я бы сначала попробовал что-нибудь типо .{,3}, но подозреваю что assertion is not fixed length намекает на то что нужна именно фиксированная длина. А после этого разбил задачу на 2 этапа - отдельно достал <nospam>.*?href="([^\"]).*?</nospam> и выкинул их из дальнейшей обработки, наверняка полученный ссылки где-то дальше крутятся в цикле