2016-08-27 2 views
-1

Diese HTML bekomme ich von der Antwort.Wie div mit einem seiner Kind p Knoten zu ersetzen

Und ich muss den zusätzlichen Text entfernen.

Es gibt eine Zeile des folgenden Inhalt

<?php 
    $str = <<<HTML 
    AAAA <span>span txt</span> 
    <div class='unique_div' id='xrz' data-id='1'> 
     div text 
     <span>span text</span> 
     <p class='unique_p'> 
      <span>p span text</span> 
      <p>p p text</p> 
     </p> 
     div text 
    </div> 
    BBBB <span>span txt</span> 
HTML; 

Wie div auf p ersetzen, die in ihm ist?

Ich brauche einen regulären Ausdruck zu schreiben, das folgende Ergebnis

<?php 
    $str = <<<HTML 
    AAAA <span>span txt</span> 
    <p class='unique_p'> 
     <span>p span text</span> 
     <p>p p text</p> 
    </p> 
    BBBB <span>span txt</span> 
HTML; 

Es gibt nur ein div und p mit solchen Attributen zu erhalten.

+1

Wir verstehen nicht.Meinst du, du willst den Inhalt ändern, ist $ str, nachdem du das erste Beispiel im zweiten Beispiel erstellt hast? – RiggsFolly

+0

Ich brauche ein Ergebnis wie im zweiten Beispiel – Sergey

+0

Warum? Erstellen Sie einfach eine separate Ausgabe basierend auf welchem ​​Grund auch immer Sie es ändern wollen – RiggsFolly

Antwort

1

Da Sie schauen, was HTML zu sein scheint, und da Ihre Anforderungen eine Form der Modifikation der Document Object Model (DOM) nach sich ziehen würde ich wie DOMDocument mit einem DOM-Parser vorschlagen.

Wenn ich Ihre Frage richtig verstanden, Sie suchen den <div> Knoten zu ersetzen, die eine id Attribut xrz mit dem p Knoten zu haben scheint, die eine Klasse Attribut unique_p und ist ein Kind des div.

  1. bekommen die div ist einfach, weil es eine id hat und sie sind einzigartig. Also können wir eine Methode wie DOMDocument::getElementById verwenden, um das div zu bekommen.
  2. Das Erhalten seines Kindes p wird ein wenig komplizierter, da wir sicherstellen möchten, dass es ein Kind von div ist und die angegebene Klasse hat. Also verlassen wir uns auf eine XPath Anfrage dafür mit DOMXPath.
  3. Schließlich ersetzen wir die div mit seinem erfassten Kind p mit DOMNode::replaceChild von dort.

Hier ist ein einfaches Beispiel.

Die Ausgabe sollte in etwa so aussehen.

 
<p>AAAA <span>span txt</span> 
    <p class="unique_p"> 
      <span>p span text</span> 
      </p><p> 
    BBBB <span>span txt</span></p></p> 

Falls Sie sich fragen, warum die Ausgabe etwas anders aus als das, was man erwarten könnte, ist es wichtig, dass Ihre erste HTML zu beachten, in Ihrer Frage zur Verfügung gestellt, tatsächlich fehlerhaft ist.

See section 9.3.1 of the HTML 4.01 specification

Das P Element stellt einen Absatz. Es darf keine Elemente auf Blockebene enthalten (einschließlich P selbst).

Also jedes Mal, wenn ein DOM-Parser findet einen Tag Öffnung p innerhalb eines anderen p Tages wird es gerade noch die vorherigen implizit schließen.

+0

Wow.Perfect solution.Thank Sie sehr viel – Sergey

+0

Sie sollten auch angeben, 'div' Klassenattribut, während eine Abfrage ausgeführt wird. – revo

+0

@revo Das ist unnötig, da eine ID im gesamten DOM gemäß der Spezifikation eindeutig sein muss. Die ID ist genug, um jedes Element im DOM ohne weitere Qualifikation eindeutig zu identifizieren. – Sherif