2017-01-12 25 views
0

我有一個頁面充滿了我試圖解析的元素。我想要class1和class2作爲單獨的文本。但是,類2存在於class1中。因此,如果我使用textContent,它將檢索所有文本。如何獲得使用DOMDocument <BR>分隔的文本內容

繼承人的結構...

<div class='class1'> 
    Name <br/> <span class='class2'>Other Name</span> 
    </div> 

如果我這樣做...

$dom = new DOMDocument(); 
$dom->loadHTMLFile($url); 
$finder = new DomXPath($dom); 
$classname="class2"; 
$nodes = $finder->query("//*[contains(@class, '$classname')]"); 
foreach($nodes as $n){ 
    echo $n->textContent; 
} 

我能得到的Class2 elemtn就好了。 但是如果我對class1做同樣的事情。我得到class1的textContent,它也包含class2的內容。

我怎樣才能提取這些分開?

回答

1

在你的榜樣,$n包含5個個子節點:

  1. 「名稱」
  2. 「< BR/>」
  3. 「」
  4. 「<跨度類= '類class2' >其他名稱</span >「
  5. 」「

屬性textContent由此節點的文本及其所有後代組成。 訪問內容只的第一個孩子使用:

echo $n->firstChild->textContent; 
+0

謝謝!超級簡單,我現在感到很蠢。我怎麼會得到第四個元素,所以我可以只使用一個查詢 – KyleK

+0

像$ node-> childNodes-> item(4) - > textContent。哪個似乎不起作用? – KyleK

+0

只是做了$ node-> firstChild-> nextSibling-> nextSibling-> textContent。不知道這是否是一種好方法。但它的工作原理,所以我很開心 – KyleK

0

在普通的JavaScript,您可以過濾/圖提取剛剛從節點文本孩子。事情是這樣的:

var c1 = document.getElementsByClassName('class1')[0].childNodes; 
var allC1Text = Array.from(c1.values()) 
    .filter(v => v.nodeName === '#text') 
    .map(t => t.textContent) 
    .join('') 
    .trim(); 

var c2 = document.getElementsByClassName('class2')[0].childNodes; 
var allC2Text = Array.from(c2.values()) 
    .filter(v => v.nodeName === '#text') 
    .map(t => t.textContent) 
    .join('') 
    .trim(); 

console.log('Class1 Text:', allC1Text); 
console.log('Class2 Text:', allC2Text); 
+1

這是一個'php'問題,而不是'javascript' – AlexM

0

只需使用DOMDocument,我會做這樣的事情:

<?php 
function getElementsByClassName(DOMDocument $dom, $className, $parentNode = null){ 
    $node = $parentNode ? $parentNode : $dom; 
    $a = array(); $all = $node->getElementsByTagName('*'); 
    foreach($all as $e){ 
    if($e->hasAttribute('class') && $e->getAttribute('class') === $className){ 
     $a[] = $e; 
    } 
    } 
    return $a; 
} 
function getNodeValueBeforeBr($node){ 
    return preg_replace('/\s*<\s*br\s*\/?\s*>$/i', '', $node->nodeValue); 
} 
$dom = new DOMDocument; @$dom->loadHTMLFile('yourFileName.php'); 
$class1 = getElementsByClassName($dom, 'class1'); $results = array(); 
foreach($class1 as $node){ 
    $results[] = getNodeValueBeforeBr($node); 
} 
print_r($results); 
?> 
相關問題