регулярное выражение в php - PullRequest
0 голосов
/ 07 января 2010
<div class="begin">...</div>

Как сопоставить HTML внутри (включая) <div class="begin"> в PHP?

Мне нужно решение regex , которое может обрабатывать вложенный регистр .

Ответы [ 5 ]

11 голосов
/ 07 января 2010

Используйте DOM и DOMXPath вместо регулярных выражений, вы мне за это поблагодарите:

// something useful:
function dumpDomNode ($node) {
    $temp = new DOMDocument();
    $temp->appendChild($node,true);
    return $temp->saveHTML();
}

$dom = new DOMDocument();
$dom->loadHTML($html_string);

$xpath-> new DOMXpath($dom);

$elements = $xpath->query("*/div/[@class='begin']");

foreach ($elements as $el) {
    echo dumpDomNode($el); // <-- or do something more useful with it
}

Попытка с помощью регулярных выражений приведет вас к безумию ...

2 голосов
/ 07 января 2010

Вот ваше регулярное выражение:

preg_match('/<div class=\"begin\">.*<\/div>/simU', $string, $matches);

Но:

  • RegEx не знает, что такое элементы XML / HTML. Для них HTML это просто строка. Вот почему остальные правы . Регулярные выражения не предназначены для анализа DOM . Они используются для поиска шаблонов строк .
  • Я предоставил Regex, потому что вы не намереваетесь анализировать всей HTML-страницы, а просто получить с нее один определенный фрагмент текста , в этом случае Regex подходит использовать.
  • Если внутри DIV есть вложенный DIV, Regex не будет работать должным образом. Если это так, не используйте Regex. Используйте одно из других решений, потому что тогда вам потребуется разбор DOM, а не сопоставление строк.
  • Для поиска строк с более или менее четко определенными началом и концом, вместо этого рассмотрите возможность использования обычных строковых функций, так как они часто бывают быстрее.
2 голосов
/ 07 января 2010

Это довольно неплохо суммирует.

Короче говоря, не используйте регулярные выражения для разбора HTML. Вместо этого посмотрите на классы DOM и особенно DOMDocument :: loadHTML

1 голос
/ 07 января 2010
// Create DOM from URL
$html = file_get_html('http://example.org/');

echo $html->find('div.begin', 0)->outertext;

http://simplehtmldom.sourceforge.net/manual.htm

0 голосов
/ 07 января 2010

вот один из способов использования строковых методов

$str= <<<A
blah
<div class="begin">
blah blah
blah
blah blah </div>
blah
A;

$s = explode("</div>",$str);
foreach($s as $k=>$v){
    $m=strpos($v,'<div class="begin">');
    if($m !==FALSE){
        echo substr("$v" ,$m);
    }
}

выход

$ php test.php
<div class="begin">
blah blah
blah
blah blah
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...