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

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

3 голосов
/ 29 августа 2009

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

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

$gallery_pattern = '/<div class="gallery">([\s\S]*)<\/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 может содержать <, / и переносы строк. просто чтобы ты знал!

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

Ответы [ 3 ]

12 голосов
/ 29 августа 2009

Вы не должны использовать регулярные выражения для анализа 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>';
    }
}
9 голосов
/ 29 августа 2009

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

$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, что само по себе не так рационально?

0 голосов
/ 31 марта 2010

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

...