Всем привет! Нужно из текста Код (Text): <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): <div>{Этот текст}</div><b>link</b> Мой код: Код (Text): <?php $str = ' <div>block text 1</div><b>link</b> <div>block text 2</div><i>italic</i> <div>block text 3</div><b>link</b> '; $pattern = '/<div>(?(?!.*?<i>.*?)(.*?))<\/div><b>(.*?)<\/b>/ui'; preg_match_all($pattern, $str, $out); print_r($out); Выводит Код (Text): Array ( [0] => Array ( [0] => <div>block text 1</div><b>link</b> [1] => <div>block text 2</div><b>link</b> ) [1] => Array ( [0] => block text 1 [1] => block text 3 ) [2] => Array ( [0] => link [1] => link ) ) , т.е. то, что нужно! Но беда - исходный текст не форматирован, и имеет вид Код (Text): <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): Array ( [0] => Array ( [0] => <div>block text 3</div><b>link</b> ) [1] => Array ( [0] => block text 3 ) [2] => Array ( [0] => link ) ) Удаляются эл-ты, после которых встречается <i>. Как понимаю, разница в переносах строк. Но форматировать исходный текст нельзя. Как сделать, чтобы строка все-таки распарсивалась полностью?
Нужно именно исключить последовательность "<i>", а символ "<" попадаться может. В этом и трудность.Свой вариант регулярки написал в коде: Код (Text): /<div>(?(?!.*?<i>.*?)(.*?))<\/div><b>(.*?)<\/b>/ui