Есть текст: Код (Text): <h1>text1</h1> <h1>text2</h1><div>textdiv1</div> <h1>text3</h1><div>textdiv2</div> Необходимо выделить этементы типа <h1>***</h1><div>***</div>, т.е. результатом должно быть 2 строки: Код (Text): <h1>text2</h1><div>textdiv1</div> <h1>text3</h1><div>textdiv2</div> Моё регулярное выражение: Код (Text): /<h1>.*?<\/h1><div>.*?<\/div>/i В результате находит 2 соответствия: Код (Text): <h1>text1</h1><h1>text2</h1><div>textdiv1</div> <h1>text3</h1><div>textdiv2</div> Не могу понять, почему захватывается текст <h1>text1</h1> ? Код PHP: Код (Text): $string = '<h1>text1</h1><h1>text2</h1><div>textdiv1</div><h1>text3</h1><div>textdiv2</div>'; $pattern = '/<h1>.*?<\/h1><div>.*?<\/div>/i'; preg_match_all($pattern, $string, $matches); foreach ($matches[0] as $match) { echo htmlentities($match) . '<br>'; }
В начало регулярки ^ в конец $ это означает что искать строку(и) которые подходят под регулярное выражение от начала и до конца. http://www.softtime.ru/bookphp/gl7_8.php
Код (PHP): $str='<h1>text1</h1><h1>text2</h1><div>textdiv1</div><h1>text3</h1><div>textdiv2</div>'; $m=array(); preg_match_all('~<h1>([^<]+)</h1><div>([^<]+)</div>~iu',$str,$m); print_r($m); Вывод: Код (PHP): Array ( [0] => Array ( [0] => <h1>text2</h1><div>textdiv1</div> [1] => <h1>text3</h1><div>textdiv2</div> ) [1] => Array ( [0] => text2 [1] => text3 ) [2] => Array ( [0] => textdiv1 [1] => textdiv2 ) ) Если потребуется потом какиенибудь типо отступы или спуски, написать типо: Код (PHP): $str='<h1>text1</h1><h1>text2</h1> <div>textdiv1</div><h1>text3</h1><div>textdiv2</div>'; $m=array(); preg_match_all('~<h1>([^<]+)</h1>[^<]*<div>([^<]+)</div>~iu',$str,$m); print_r($m); Добавляем между: </h1>[^<]*<div> Код (PHP): Вывод: Array ( [0] => Array ( [0] => <h1>text2</h1> <div>textdiv1</div> [1] => <h1>text3</h1><div>textdiv2</div> ) [1] => Array ( [0] => text2 [1] => text3 ) [2] => Array ( [0] => textdiv1 [1] => textdiv2 ) )