PHP'nin DOMXPath eşleşen metin içinde benim etiketleri dışarı stripping

1 Cevap php

Dün bu soruyu sordu ve zamanda ben sadece ne gerekli oldu, ama bazı canlı veriler ile çalışırken oldukça beklediğim yapmıyorum olduğunu keşfetti. http://stackoverflow.com/questions/2571232/parse-html-with-phps-html-domdocument

Bu HTML sayfasından veriyi alır, ama sonra o da ne istediğiniz değil, hangi metnin yakalanan blok içindeki tüm HTML etiketleri şeritler. (Ben bazı etiketleri çıkarmak için wan't, ama hepsi değil, ve bu daha sonra yapılabilir olabilir)

1 Cevap

Bu DOM ile ortak bir sorun var: Eğer bir etiketin içeriği almak istiyorsanız biraz daha fazla iş yapmak zorunda, ve tüm çocukların içeriği.

Temel olarak, onların içeriğini almak için, XPath sorgusu ile eşleşen ettik birinin alt düğümler üzerinde döngü var.

DOMElement sınıfına -- see this note manuel sayfasında tek tek kullanıcı notları önerilen bir çözüm var.


Integrating this solution into the code you already have should give you something that looks like this for the declaration of the HTML string, with sub-tags :

$html = <<<HTML
<div class="main">
    <div class="text">
        <p>
            Capture this <strong>text</strong> <em>1</em>
        </p>
        <p>
            And some other <strong>text</strong>
        </p>
    </div>
</div>
HTML;


And, to extract the data from that HTML string, you can use something like that :

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

$xpath = new DOMXPath($dom);

$tags = $xpath->query('//div[@class="main"]/div[@class="text"]');
foreach ($tags as $tag) {
    $innerHTML = '';

    // see http://fr.php.net/manual/en/class.domelement.php#86803
    $children = $tag->childNodes;
    foreach ($children as $child) {
        $tmp_doc = new DOMDocument();
        $tmp_doc->appendChild($tmp_doc->importNode($child,true));       
        $innerHTML .= $tmp_doc->saveHTML();
    }

    var_dump(trim($innerHTML));
}

Değişti tek şey foreach döngünün içeriği: yerine sadece kullanarak $tag->nodeValue, sen alt öğeler üzerinde yinelemek zorunda.


Which gives me the following output :

string '<p>
            Capture this <strong>text</strong> <em>1</em>
        </p>


<p>
            And some other <strong>text</strong>
        </p>' (length=150)

Hangi eşleşmiş <div> etiketi, ve tüm çocukların tam içeriği - etiketler dahil.


Note : there are often interesting ideas and solution in the users notes of the manual ;-)