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

Тема в разделе "PHP", создана пользователем akhkharu, 27 ноя 2008.

Статус темы:
Закрыта.
Модераторы: latteo
  1. akhkharu

    akhkharu Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    111
    Симпатии:
    12
    Нужно регулярное выражение для замены текста на ссылку. Например, текст «Пример1» заменяется на «<a href="http://www.primer1.ru/">Пример1</a>». Использую регулярное выражение:

    Код:
    /(Пример1(?![^<\.]*<\/a>))/
    
    Но, данное выражение так же заменит текст на ссылку в следующем случае:

    HTML:
    
    <img src="image.jpg" alt="Бла бла бла Пример1 бла бла">
    
    А этого делать, разумеется, не нужно. Пока что исключить данный вариант не получается (пробовал использовать look-behind подмаски для фильтрации предшествующего текста, однако они не поддерживают переменную длину). У кого-нибудь есть идеи?
     
  2. Liver

    Liver

    Регистр.:
    24 сен 2008
    Сообщения:
    316
    Симпатии:
    91
    Всегда удивлялся почему в регулярках нет отрицания строк, как с символами. То есть нельзя указать "не альт".

    Поэтому можно пойти другим путем. Вначале обработай текст регуляркой
    Код:
    alt(\s*=.+?)Пример1 
    заменяем на
    alt$1[#########]
    
    Потом проходи своей регуляркой. А потом простым str_replace замени [#########] обратно на Пример1
     
    akhkharu нравится это.
  3. akhkharu

    akhkharu Постоялец

    Регистр.:
    26 июн 2007
    Сообщения:
    111
    Симпатии:
    12
    Спасибо, видимо придется поступить именно таким способом. Жаль, что нельзя произвести замену за один проход по тексту.
     
  4. zetar

    zetar

    Регистр.:
    18 май 2007
    Сообщения:
    497
    Симпатии:
    348
    PHP:
    $cnt=1// количество замен
    $content="...."// текст
    $key="Пример1";
    $link="<a href=\"http://www.primer1.ru/\">Пример1</a>";

    $content=preg_replace("/(\W)(".$key.")(\W)/i""$1 ".$link." $3",$content,$cnt);
    должно работать
     
Статус темы:
Закрыта.