DOMDocument üzerinde döngü

3 Cevap php

Ben bu soruya gelen öneri takip ediyorum Sağlam, Mature HTML Parser for PHP ile hatalı biçimlendirilmiş olabilir html ayrıştırma hakkında DOMDocument.

Çözümlü belge üzerinde döngü için kolay bir yolu var mı? Yani böyle html üzerinde döngü istiyorum.

$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';

$doc = new DOMDocument();
$doc->loadHTML($html);
???
foreach (??? as $node)
{
  print $node->nodeName.':'.$node->nodeValue;
}

Ve biraz bu gibi sonuçlar elde.

 ul:
 li:value1
 li:value2
 li:value3
 p:subvalue
 p:hello world

$doc->childNodes kendisi tarafından kullanılması gerçekten ne istediğinizi yapmaz. O ağacın alt dalları aşağı gitmek için görünmüyor çünkü. I halfdan tarafından önerilen kodu kullanılmış ve bu gibi sonuçlar elde.

html:
html:value1
         value1
         value3
            subvalue

        hello world

3 Cevap

Bu deneyin:

$doc = new DOMDocument();
$doc->loadHTML($html);
showDOMNode($doc);

function showDOMNode(DOMNode $domNode) {
    foreach ($domNode->childNodes as $node)
    {
        print $node->nodeName.':'.$node->nodeValue;
        if($node->hasChildNodes()) {
            showDOMNode($node);
        }
    }    
}

Cheers,
Fabian

Ben çocuklar yoktu bile unsurlar yaptılar dönen c verileri vardı elemanları ile ilgili sorunlarınız oldu.

Ben neden emin değilim.

Ben buldum çevresinde iş değiştirmek oldu

if($node->hasChildNodes()) {
        showDOMNode($node);
    }

karşı

if($node->childNodes->length != 1) {
        showDOMNode($node);
    }

Ve kod artık mükemmel çalışıyor.

Sen PHP Simple HTML DOM Parser ve aşağıdaki kodu kullanmanız gerekir:

<?php
require_once 'simplehtmldom/simple_html_dom.php';

function iterateHtmlElements($html)
{
    $dom = str_get_html($html);
    $dom->set_callback('handleElement');
    $dom->__toString();
    echo "\n";
}

function handleElement(simple_html_dom_node $elem)
{
    if($elem->tag == 'text') {
        echo $elem->innertext();
    }
    else {
        echo "\n" . $elem->tag . ": ";
    }
}

$html='<ul>
         <li>value1</li>
         <li>value1</li>
         <li>value3
            <p>subvalue</p>
         </li>
        </ul>
        <p>hello world</p>';
iterateHtmlElements($html);

Bu tam beklendiği gibi çalışır. Ben aşağıdaki sonuçları sağlanan ve got girişi ile kontrol:

> php test2.php

ul:
li: value1
li: value1
li: value3
p: subvalue
p: hello world