За последние 24 часа нас посетили 18158 программистов и 1591 робот. Сейчас ищет 1061 программист ...

RegExp, preg_match_all и перенос строки

Тема в разделе "Регулярные выражения", создана пользователем yakoval, 25 фев 2013.

  1. yakoval

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

    С нами с:
    25 фев 2013
    Сообщения:
    2
    Симпатии:
    0
    Всем привет!
    Нужно из текста
    Код (Text):
    1.  
    2. <div>block text 1</div><b>link</b>
    3. <div>block text 2</div><i>italic</i>
    4. <div>block text 3</div><b>link</b>
    Получить значения из блоков, после которых идет жирный текст, т.е.
    Код (Text):
    1.  
    2. <div>{Этот текст}</div><b>link</b>
    Мой код:
    Код (Text):
    1.  
    2. <?php
    3.   $str = '
    4. <div>block text 1</div><b>link</b>
    5. <div>block text 2</div><i>italic</i>
    6. <div>block text 3</div><b>link</b>
    7. ';
    8.  $pattern = '/<div>(?(?!.*?<i>.*?)(.*?))<\/div><b>(.*?)<\/b>/ui';
    9. preg_match_all($pattern, $str, $out);
    10. print_r($out);
    Выводит
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [0] => <div>block text 1</div><b>link</b>
    7.             [1] => <div>block text 2</div><b>link</b>
    8.         )
    9.  
    10.     [1] => Array
    11.         (
    12.             [0] => block text 1
    13.             [1] => block text 3
    14.         )
    15.  
    16.     [2] => Array
    17.         (
    18.             [0] => link
    19.             [1] => link
    20.         )
    21. )
    , т.е. то, что нужно!
    Но беда - исходный текст не форматирован, и имеет вид
    Код (Text):
    1.  
    2. <div>block text 1</div><b>link</b><div>block text 2</div><i>italic</i><div>block text 3</div><b>link</b>
    т.е. без переносов строки. И результат получается такой:
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [0] => Array
    5.         (
    6.             [0] => <div>block text 3</div><b>link</b>
    7.         )
    8.  
    9.     [1] => Array
    10.         (
    11.             [0] => block text 3
    12.         )
    13.  
    14.     [2] => Array
    15.         (
    16.             [0] => link
    17.         )
    18.  
    19. )
    Удаляются эл-ты, после которых встречается <i>.
    Как понимаю, разница в переносах строк. Но форматировать исходный текст нельзя. Как сделать, чтобы строка все-таки распарсивалась полностью?
     
  2. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    /<div>([^<]+)<\/div><b>/i
     
  3. yakoval

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

    С нами с:
    25 фев 2013
    Сообщения:
    2
    Симпатии:
    0
    Нужно именно исключить последовательность "<i>", а символ "<" попадаться может. В этом и трудность.Свой вариант регулярки написал в коде:
    Код (Text):
    1.  
    2. /<div>(?(?!.*?<i>.*?)(.*?))<\/div><b>(.*?)<\/b>/ui