2016-07-09 10 views
1

Angenommen, ich möchte die automatische Optimierung von Schriftanfragen basierend auf der Element- und Inhaltsstruktur einer Seite implementieren. Wie würde ich die benötigten Informationen mit PHPs DomDocument erhalten?Wie bekomme ich Element- und Inhaltsstruktur mit DomDocument von PHP?

Das Problem, auf dem Punkt kann mit zwei Strukturbeispielen veranschaulicht werden:

Beispiel 1

<p><em>All italic paragraph text</em></p> 

Beispiel 2

<p>Normal paragraph text <em>and some italic text</em></p> 

Die Elementstruktur die gleiche in den beiden Beispielen ist, dh ein Absatzelement mit einem untergeordneten Element <em>. Allerdings unterscheidet sich die Inhaltsstruktur: Der Text ist kursiv in Beispiel 1, aber es ist normal und kursiv Text in Beispiel 2

Mein aktueller Ansatz für die Elementstruktur bekommen ist so etwas wie dieses:

$dom = new DOMDocument; 
foreach ($dom->getElementsByTagName('p') as $elm) { 
    $elms[] = $dom->saveHTML($elm); 
} 

Ich würde dann durch die Elemente iterieren und den gleichen Ansatz zum Finden verschachtelter Elemente wie <em> und <strong> verwenden.

Aber ich brauche einen guten Ansatz für die Inhaltsstruktur. Ich glaube, ich könnte den Text mit <em> und </em> teilen und sehen, ob das erste und das letzte Element in der resultierenden Liste Länge haben, aber das erinnert mich an benutzerdefinierte HTML-Suche mit Regex, die hier der am wenigsten empfohlene Ansatz scheint.

Aber was sind meine Alternativen in diesem Fall?

Antwort

1

können Sie DOMXPath verwenden, um die einzelnen Textknoten zu finden:

$html = "<p>Normal paragraph text <em>and some italic text</em></p>"; 

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXpath($dom); 
$textNodes = $xpath->query("//text()"); 
$elms = []; 
foreach ($textNodes as $elm) { 
    $elms[] = array(
     "parent" => $elm->parentNode->tagName, 
     "path" => $elm->parentNode->getNodePath(), 
     "text" => $elm->textContent 
    ); 
} 

$elms enthalten:

array (
    array (
    'parent' => 'p', 
    'path' => '/html/body/p', 
    'text' => 'Normal paragraph text ', 
), 
    array (
    'parent' => 'em', 
    'path' => '/html/body/p/em', 
    'text' => 'and some italic text', 
), 
) 
+0

Vielen Dank! Das scheint genau das zu sein, wonach ich gesucht habe. Obwohl es nicht DomDocument ist, ist es stille PHP, nach der ich wirklich gesucht habe. Vielen Dank. –

Verwandte Themen