Я пытаюсь найти 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/ Этот класс поможет мне быстро решить подобную проблему