2017-02-04 8 views
3

HTMLファイルのDOM(私はテキスト要素にのみ関心があります)に移動しようとするたびに、ノードのtextContentプロパティをポイントするとエコーしますその特定のノードツリーにあるすべてのテキスト。たとえば :HTML DOM:PHPでtextContentプロパティを正しく使用する方法

以下になり

<html lang="en"> 
<body> 
    <p> 1st text I need</p> 
    <a href="#">2nd text I need</a> 
    <table> 
     <tr> 
      <td>3rd text I need</td> 
     </tr> 
    </table> 
</body> 
</html> 

#document 
html 
html 1st text I need 2nd text I need 3rd text I need 
body 1st text I need 2nd text I need 3rd text I need 
p 1st text I need 
a 2nd text I need 
table 3rd text I need 
tr 3rd text I need 
td 3rd text I need 

私だけ直接テキストコンテンツを持つ要素からテキストを抽出したいと思います。上記の例では、p,およびddとなります。

どうすればいいですか?

はこちら(hereから抽出された)コードです:

<?php 

$doc = new DOMDocument(); 
@$doc->loadHTMLFile('test.html'); 
walkDom($doc); 


function walkDom($node, $level = 0) 
{ 
$indent = ''; 
for ($i = 0; $i < $level; $i++) 
$indent .= ' '; //prettifying the output 
if($node->nodeType != XML_TEXT_NODE) { 
    echo $indent .'<b>' . $node->nodeName .'</b>'; 
    if($node->nodeType == XML_ELEMENT_NODE) { 
     echo $node->textContent; 
    } 
    echo '<br>'; 
} 
    $cNodes = $node->childNodes; 
    if (count($cNodes) > 0) 
    { 
     $level++; // go one level deeper 
     foreach($cNodes as $cNode) 
     walkDom($cNode, $level); 
     $level = $level - 1; 
    } 
} 

答えて

2

あなたはDOM文書にXPathを使用することができます。 text()はすべてのテキストノードを返します。

$doc = new DOMDocument; 
$doc->loadhtml('<html lang="en"> 
<body> 
    <p> 1st text I need</p> 
    <a href="#">2nd text I need</a> 
    <table> 
     <tr> 
      <td>3rd text I need</td> 
     </tr> 
    </table> 
</body> 
</html>'); 
$doc->normalizeDocument(); 
$xpath = new DOMXpath($doc); 
$results = $xpath->query("//text()"); 
foreach($results as $node) { 
    echo trim($node->wholeText); 
} 
+0

ありがとうございます。これらのテキスト要素を変更することは可能ですか(これは私の最終目標であり、言及するのを忘れました)? –

+0

それは完全に別個の質問でしょう。 – miken32

+1

フェアポイント。別の質問を提出します。ご回答有難うございます。 –

関連する問題