2016-04-28 7 views
1

Meine Funktionen müssen alle HTML-Tags der ersten Ebene von einem Teil des HTML-Codes erhalten, damit ich dann mit jedem arbeiten kann.PHP & Xpath: Holen Sie sich die erste Ebene HTML-Tags (alle Geschwister)

Das ist mein HTML-Dokument hier zusammengefasst:

<p>The breed was first...</p> 
<p>Semencic credits his...</p> 

<h1>Appearance</h1> 
<p>The breed's distinctive...</p> 
<p>It should be symmetrical...</p> 

<figure id="attachment_6" style="width: 840px" class="wp-caption alignnone"> 
    <img class="size-large wp-image-6" src="...jpg" alt="boerboel appearance" width="840" height="746"> 
    <figcaption class="wp-caption-text">The dog appearance.</figcaption> 
</figure> 

<h1>Requirements</h1> 
<p>Prospective owners....</p> 
<p>These dogs....</p> 

<h2>A Little Warning!</h2> 
<p>If you are considering...</p> 
<blockquote> 
    <p>According to...</p> 
    <p>Source: http://...</p> 
</blockquote> 
<p>Although more suitable...</p> 

Jetzt möchte ich meine Ausgabe sein:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

Aber jetzt ist es:

h1 
p 
h1 
p 
h2 
p 
blockquote 
p 

Es sind mehrere Dinge falsch: - die 'Figur' zeigt nicht - die Par Agraph Tags werden auch ausgesondert, wenn es mehrere Geschwister - die erste p ist nicht

gefunden
$doc = new DOMDocument(); 
$doc->loadHTML($this->post_content, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

$xpath = new DOMXpath($doc); 
$nodes = $xpath->query("/*/*"); 

foreach ($nodes as $node) { 

    echo $node->nodeName; 
    echo '<br>'; 

    $this->add_part(
     md5($node->textContent), 
     $node->nodeName 
    ); 
} 
+1

Ich denke, Ihnen die echte HTML-Code zu schreiben haben. Ihr Code funktioniert für mich, indem er Ihr HTML-Beispiel mit einem Tag umschließt. – fusion3k

+0

mein html-code ist der echte html-code, es gibt kein tag, der all dies umhüllt. – Lazhar

Antwort

0

DOM (Libxml) wird neu formatiert die Eingabe so dass es ein einzelnes Dokumentelement hat. Wenn Sie die Parser-Optionen (LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD) entfernen, repariert es das HTML und fügt html und body Elemente hinzu. Also, wenn Sie die Elementknoten innerhalb body wollen Sie den Ausdruck //body/*

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach ($xpath->evaluate('//body/*') as $node) { 
    var_dump($node->nodeName); 
} 

Ausgabe verwenden:

string(1) "p" 
string(1) "p" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(6) "figure" 
string(2) "h1" 
string(1) "p" 
string(1) "p" 
string(2) "h2" 
string(1) "p" 
string(10) "blockquote" 
string(1) "p" 
0

Für die Datensätze: mit präzisen HTML Probe, erhalte ich dieses Ergebnis:

p/h1/p/p/figure/h1/p/p/h2/p/blockquote/p 

statt dieses (wie pro Ihre Frage):

h1/p/   h1/p/ h2/p/blockquote/p 

3v4l.org demo

Also ich weiß nicht, ob diese Antwort Ihr Problem in realem Code löst.


HTML hat einige Regeln. Sie versuchen, einen Code ohne Root-Element zu verarbeiten. Wickeln Sie Ihren Code durch so etwas wie <body>:

$doc->loadHTML("<body>$txt</body>", LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); 

Durch diese Weise erhalte ich das gewünschte Ergebnis:

p 
p 
h1 
p 
p 
figure 
h1 
p 
p 
h2 
p 
blockquote 
p 

3v4l.org demo

+0

Wenn diese Lösung nicht funktioniert, können Sie bitte "-> post_content" drucken und uns das Ergebnis anzeigen (Kopieren von Seitenquelle, nicht von gerenderter Seite oder Inspektor)? – fusion3k