2010-11-22 12 views
2

unter Berücksichtigung der folgenden: (Mischung aus <br> und <br/>)XPath: Wählen Sie Textknoten vor und nach der Pause Tags

text1 
<br> 
text2 
<br/> 
text3 
<br/> 
text4 
<br> 
text5 

Wie kann ich jeden Textknoten ausfindig zu machen?

Ich denke etwas, das die Bedingung des vorhergehenden ODER nach einem br Tag passt .... aber unsicher, wenn <br> und <br/> unterschiedlich in Xpath behandelt werden.

+3

, die nicht wie gültige XML sieht für XPATH zu arbeiten. – geoffc

+0

Das ist * nicht * eine XPAth-Frage überhaupt - Ihr Text ist kein wohlgeformtes XML! Erfahren Sie, dass XPath nur für wohlgeformte XML-Dokumente oder XML-Fragmente verwendet werden kann. –

+0

Ich fand Ihre Bearbeitung sehr offensiv und habe es gemeldet. Ich habe einen Rollback. Ich denke, es sollte für Sie offensichtlich sein, dass dieser Xpath nicht gut gebildet ist, aber mit HTML aus dem Internet umgehen, es ist nur eine Tatsache und muss mit diesen irregulären Fällen umgehen. – KJW

Antwort

5

DOMDocument ‚s loadhtml() Methode funktioniert gut mit ungültigen HTML-Fragmente, so können Sie verwenden DOMXPath auf diese Weise:

<?php 

$html = 'text1 
<br> 
text2 
<br/> 
text3 
<br/> 
text4 
<br> 
text5'; 

echo "<pre>" . htmlentities($html) . "</pre><br>\n"; 

$dom = new DOMDocument(); 
// loadHtml() needs mb_convert_encoding() to work well with UTF-8 encoding 
$dom->loadHtml(mb_convert_encoding($html, 'HTML-ENTITIES', "UTF-8")); 

$xpath = new DOMXPath($dom); 

echo "Text nodes preceding br:"; 
foreach($xpath->query('//text()[(following::br)]') as $node) 
{ 
    var_dump($node->wholeText); 
} 

echo "Text nodes following br:"; 
foreach($xpath->query('//text()[(preceding::br)]') as $node) 
{ 
    var_dump($node->wholeText); 
} 

echo "Text nodes following OR preceding br:"; 
foreach($xpath->query('//text()[(following::br) or (preceding::br)]') as $node) 
{ 
    var_dump($node->wholeText); 
} 
+0

Dies würde einfach alle anderen Textknoten als den dargestellten Beispielfall enthalten. – KJW

+0

@Kim Sie haben Recht, ich habe diese Anforderung einfach übersehen. Bearbeitet, jetzt funktioniert es so. –

+0

danke, ich denke, das entspricht der Spezifikation. Ich denke darüber nach, dies zu kombinieren, um etwas wie // text() [(folgt :: br OR precauting :: br)] zu bilden. – KJW

0

Ihr Beispiel ist kein gültiges XML, mit dem eine XPath-Abfrage ausgeführt werden kann - keines der Elemente
ist jemals geschlossen.

jedoch in der Regel zu wählen, dass Sie den Knotentyp Prädikat verwenden würde, so etwas wie // br/text()

+0

Gute Antwort, +1. –

+1

Ich habe diese Frage abgelehnt, weil meine Definition einer guten Antwort offensichtlich von Dimitr unterscheidet. Ich lehne Antworten ab, in denen keine Lösung oder Herangehensweise gegeben ist, und Antworten, die eher ein Kommentar als eine Antwort sind, die sich aus der aktiven Lösung eines Problems ergibt, anstatt das Offensichtliche zu erwähnen oder aus dem Wörterbuch zu lesen. Sie müssen die implizite Bedeutung hinter den Fragen verstehen, und es ist nicht immer einfach, es richtig zu machen, und einige Leute werden mehr Schwierigkeiten haben. Am Ende des Tages habe ich Antworten hochgeladen, die anderen Nutzern helfen, über die gleiche Frage nachzudenken, die ich habe. – KJW

Verwandte Themen