regex php: найти все в div

Я пытаюсь найти eveything внутри div, используя regexp. Я знаю, что, вероятно, есть более умный способ сделать это, но я выбрал regexp.

поэтому в настоящее время мой шаблон regexp выглядит так:

$gallery_pattern = '/<div class="gallery">([\s\S]*)<\/div>/'; 

И это трюк – несколько.

Проблема в том, что у меня есть два div друг за другом – вот так.

 <div class="gallery">text to extract here</div> <div class="gallery">text to extract from here as well</div> 

Я хочу извлечь информацию из обоих div, но моя проблема при тестировании заключается в том, что я не получаю текст между ними в результате, а вместо этого:

 "text to extract here </div> <div class="gallery">text to extract from here as well" 

Итак, подведем итог. Он пропускает первый конец div. и продолжается дальше к следующему. Текст внутри div может содержать < , / и linebreaks. просто так вы знаете!

У кого-нибудь есть простое решение этой проблемы? Я все еще новичок в регулярном выражении.

Что-то вроде этого:

 $str = <<<HTML <div class="gallery">text to extract here</div> <div class="gallery">text to extract from here as well</div> HTML; $matches = array(); preg_match_all('#<div[^>]*>(.*?)</div>#', $str, $matches); var_dump($matches[1]); 

Обратите внимание '?' в регулярном выражении, поэтому он «не жадный».

Который доставит вас:

 array 0 => string 'text to extract here' (length=20) 1 => string 'text to extract from here as well' (length=33) 

Это должно работать нормально … Если у вас нет перевязанных div; если вы это сделаете … Ну … на самом деле: вы действительно уверены, что хотите использовать рациональные выражения для анализа HTML, что совершенно не так рационально?

Вы не должны использовать регулярное выражение для анализа HTML, когда есть удобная библиотека DOM:

 $str = ' <div class="gallery">text to extract here</div> <div class="gallery">text to extract from here as well</div> '; $doc = new DOMDocument(); $doc->loadHTML($str); $divs = $doc->getElementsByTagName('div'); if ( count($divs ) ) { foreach ( $divs as $div ) { echo $div->nodeValue . '<br>'; } } 

Возможный ответ на эту проблему можно найти по адресу http://simplehtmldom.sourceforge.net/ Этот класс поможет мне быстро решить подобную проблему