php regex sorunu

6 Cevap php
<div class="begin">...</div>

Nasıl iç (dahil) html maç için <div class="begin"> PHP?

Ben bir regex çözüm gerekir that can handle nested case.

6 Cevap

Yerine regex ve DOM ve DOMXPath kullanın, bunun için bana teşekkür edeceksiniz:

// 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
}

Regex ile çalışıyor delilik yol aşağı götürecek ...

İşte Regex olduğunu:

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

But:

  • RegEx XML / HTML öğeleri ne olduğunu bilmiyorum. Onlara göre, HTML sadece bir dizedir. Bu yüzden the others are right. Regex olan not for parsing DOM . They are used to find string patterns.
  • Eğer parse tüm bir HTML sayfası niyetinde, ama sadece bir Regex kullanmak için gayet iyi durumda ondan text biri tanımlanmış parça kapmak yok çünkü ben Regex sağladı.
  • DIV içinde iç içe DIV varsa beklendiği gibi, Regex çalışmaz. Bu durumda, Regex kullanmayın. Sonra DOM ayrıştırma değil, dize eşleme gerekir, çünkü diğer çözümlerden birini kullanın.
  • Daha az ya da açıkça tanımlanmış başlangıç ​​ve sonu ile dizeleri bulmak için, genellikle daha hızlı olduğu gibi, yerine düzenli dize işlevlerini kullanmayı düşünün.

This oldukça iyi özetliyor.

Kısacası, HTML ayrıştırmak için normal ifadeler kullanmayın. Bunun yerine, DOM sınıfları bakmak ve özellikle DOMDocument::loadHTML

// Create DOM from URL
$html = file_get_html('http://example.org/');

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

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

Burada dize yöntemleri kullanarak bir yolu

$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);
    }
}

çıktı

$ php test.php
<div class="begin">
blah blah
blah
blah blah