2016-07-09 2 views
1

私はページの要素とコンテンツ構造に基づいて自動フォントリクエストの最適化を実装したいと考えていましたが、PHP DomDocumentを使用して必要な情報をどのように取得できますか?一言で言えばPHPのDomDocumentを使用して要素とコンテンツの両方の構造を取得するには?

問題は、2つの構成例で示すことができる。

例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>とテキストを分割し、結果のリストの最初と最後の要素が長さを持っているかどうかを確認することができると思うが、ここで最も推奨されていないアプローチと思われるregexを使用してカスタム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ではありませんが、それは私が本当に後になったものであるstil native phpです。ありがとう。 –

関連する問題