За последние 24 часа нас посетили 19692 программиста и 1692 робота. Сейчас ищут 1917 программистов ...

Замена строки не внутри тега

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

  1. bFree

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

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    Мне нужно сделать подсветку некоторой части строки (для результатов поиска), однако, надо игнорировать все совпадения, которые находяться между знаками "<" и ">", т.е. в тегах.
    Например: <a href="http://linux.com">Linux</a>, linux в адресе должно пропустить.
     
  2. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Код (Text):
    1. /(?<! <)(.+?)(?! >)/isx
     
  3. bFree

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

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    не работает, только понять не могу, почему у вас две "<" ?
     
  4. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Потому что группа в скобке означает негативный просмотр вперед с учетом знака <

    В каком смысле?
    Нужно не захватывать повторяющиеся?
    Это делается вручную с учетом количеств найденных влождений из preg_match_all

    PHP:
    1. <?
    2.  
    3. $string = '<a href="http://linux.com">Linux</a> ';
    4.  
    5. if(preg_match_all('/(?<! <)(.+)(?! >)/isx', $string, $found)) {
    6.     print_r($found);
    7. }
    8.  
    9. ?>
    Выведет:
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => <a href="http://linux.com">Linux</a>
    6.         )
    7.  
    8.     [1] => Array
    9.         (
    10.             [0] => <a href="http://linux.com">Linux</a>
    11.         )
    12.  
    13. )
    А теперь учитывайте повторы.
     
  5. bFree

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

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    Пользователь ввел в поиске linux, я вытащил из базы нужные записи, теперь мне надо в выводе заменить linux на <span class="hightlight">linux</span>, т.е. подсветить это слово. Но, если парсер увидит linux в ссылке, или в адресе изображения, то он и его заменит, и получится ерунда.
     
  6. Apple

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

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    PHP:
    1. <?
    2.  
    3. $string   = 'You have said LINUX??? <a href="http://linux.com\">Linux</a> There is no any Linux, there is the Windows!';
    4. $haystack = 'linux';
    5.  
    6. if(preg_match_all('/(?<!>)'.$haystack.'(?!<)/isx', $string, $found)) {
    7.     print_r($found);
    8. }
    9.  
    10. ?>
    Выведет:
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [0] => LINUX
    6.             [1] => linux
    7.             [2] => Linux
    8.         )
    9.  
    10. )
    Как видите, захватило всё, но не в скобках ссылку.
    ОДНАКО! захватил текст самой ссылки, это можно перехватывать другим регулярным выражением или сделать логическое исключение для текста, находящегося в ссылке.
    НО учитывайте, что негативный или позитивный просмотр может быть только для текста фиксированной длины, поэтому лучше делать два регулярных выражения.
     
  7. bFree

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

    С нами с:
    17 авг 2008
    Сообщения:
    81
    Симпатии:
    0
    вот я про это и говорю, ничего из самого адреса трогать не надо :)