2016-07-09 65 views
1

假設我想實現基於頁面元素和內容結構的自動字體請求優化,我將如何使用PHP DomDocument獲取所需的信息?如何使用PHP DomDocument獲取元素和內容結構?

簡而言之的問題可以用兩個結構的例子進行說明:

實施例1

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

實施例2

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

的元件結構是在這兩個實施例中的相同,即一個帶有<em>子元素的段落元素。然而,內容結構不同:所有文字實例1中斜體,但例如在正常和斜體2.

我目前用於獲取元素結構做法是這樣的:

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

然後,我會遍歷元素並使用相同的方法來查找嵌套元素,如<em><strong>

但我需要一個很好的內容結構方法。我想我可以用<em></em>分割文本,並查看結果列表中的第一個和最後一個元素是否具有長度,但這讓我想起使用正則表達式進行自定義HTML搜索,這似乎是這裏最不推薦的方法。

但在這種情況下,我的替代方案是什麼?

回答

1

您可以使用DOMXPath找到各個文本節點:

$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將包含:

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

非常感謝您!這似乎正是我正在尋找的。即使它不是DomDocument,它仍然是原生的php,這是我真正的追求。謝謝。 –

相關問題