2010-08-30 7 views
9

Mögliche Duplizieren:
RegEx match open tags except XHTML self-contained tagsRegexp für html

Ich habe die folgende Zeichenfolge:

$str = " 
<li>r</li> 
<li>a</li> 
<li>n</li> 
<li>d</li> 
... 
<li>om</li> 
"; 

Wie erhalte ich den HTML-Code für das erste n-ten <li> Stichworte?

Ex : n = 3 ; result = "<li>r<...>n</li>; 

Ich möchte eine Regexp wenn möglich.

+11

[rant] (http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454) –

+6

Alles, was Sie wissen müssen, kann gefunden werden hier: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – prodigitalson

+9

Warum all das Downvoting? Die meisten Neulinge machen diesen Fehler einmal (und hoffentlich nur einmal). OP analysiert auch nicht ganze Dokumente, es sieht aus wie eine Kette von nicht verschachtelten '

  • ' Tags. Kein guter Ort, um Regex zu benutzen, aber es ist auch nicht schlecht. – FrustratedWithFormsDesigner

    Antwort

    11

    So.

    $dom = new DOMDocument(); 
    @$dom->loadHTML($str); 
    $x = new DOMXPath($dom); 
    
    // we wan the 4th node. 
    foreach($x->query("//li[4]") as $node) 
    { 
        echo $node->c14n() 
    } 
    

    Oh ja, lernen xpath, wird es Ihnen viel Mühe in die Zukunft retten.

    +0

    Ich würde immer SimpleXML über DOMDocument für so einfache Dinge empfehlen, da DOMDocument eine Überladung zusätzlicher Objekte (wie für xpath) benötigt und die Auswahl von Elementen und deren Inhalt zu kompliziert macht. – 2ndkauboy

    +0

    @ Kau-Boy - interessant, Pflege ein Beispiel zu schreiben? Stellen Sie auch fest, dass DOMDocument nicht erfordert, dass Sie die HTML-Datei ordentlich ausführen. Das ist für mich ein großer Gewinn. –

    7

    Die Lösung von @Byron aber mit SimpleXML:

    $xml = simplexml_load_string($str); 
    
    foreach($xml->xpath("//li[4]") as $node){ 
        echo $node[0]; // The first element is the text node 
    } 
    

    EDIT: Ein weiterer Grund, warum ich wie bei simplexml wirklich ist das einfache Debugging des Inhalts eines Knotens. Sie können einfach print_r ($ xml) verwenden, um das Objekt mit seinen untergeordneten Knoten zu drucken.

    +0

    Fehler in Zeile drei !! –

    +0

    Junge, Danke +1 –

    +0

    Korrigiert, danke für den Hinweis! – 2ndkauboy