2011-05-19 79 views
0

我想提取一些未包含在使用PHP的任何標記中的純文本。最好的解釋方式是展示;提取包含其他dom元素但不包含在任何標記內的明文

<div> 
    <span>Hello</span> 
     THIS IS THE TEXT I WANT TO EXTRACT 
    <span>this is some other text</span> 
    <div><span>pow</span></div> 
</div> 

我正要嘗試的是循環並刪除div內的所有dom元素,並且應該保留文本。但我希望有一個更優雅的方法:)

感謝

安迪

回答

3

如果我正確地讀你的問題,你想獲得該元素的文本,但不包括孩子的文本元素。

使用JavaScript,對於這裏的解決方案:

http://www.stevefenton.co.uk/Content/Blog/Date/201007/Blog/Jquery-Get-Text-While-Excluding-Children/

而在總結,你可以這樣做......

$("#mydiv").clone().children().remove().end().text(); 

在PHP(使用phpquery)這個就是...

$phpqueryObj = phpQuery::newDocument(DOMinnerHTML($INNERHTMLOFYOURDOMELEMENT)); 
$text = $phpqueryObj->clone()->children()->remove()->end()->text(); 

沒有jQuery/JavaScript你會有手動執行類似的過程,即從元素的克隆版本中移除子元素,然後獲得內部文本。

+0

這適用於phpquery(我沒有使用javascript)。上帝知道如何:D但它確實!謝謝Sohnee – Garbit 2011-05-19 12:27:57

+0

我很高興我能幫忙! – Fenton 2011-05-19 12:37:14

1

最簡單的方法可能是使用給定上下文節點的XPath。

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
//find all div nodes 
foreach ($xpath->query('//div') as $div) { 
    //get any immediate child text nodes 
    foreach ($xpath->query('text()', $div) as $text) { 
     echo "$text->nodeValue\n"; 
    } 
} 

請注意,第一個查詢將返回所有 div的,所以你要讓它爲你想要的div更加具體。

我在你的例子上面測試了上面的代碼,它工作。

+0

此方法也適用,但由於其複雜性n2(循環內的循環),這可能會比其他版本更慢 – Garbit 2011-05-19 12:34:57

+0

您需要返回學校。在最壞的情況下,這是O(log n),O(n)(我不知道DOMDocument的內部工作原理)。兩個循環不會O(n^2)。我也不知道$(),.clone(),.children(),.remove(),.end(),.text()的內部工作原理。你怎麼知道這些都不是O(n^2)本身? – 2011-05-19 12:46:00

+0

事實上,另一個可能會更復雜。對不起,我錯誤計算(正在考慮for循環)。請注意,儘管我評論你的評論無論如何:) – Garbit 2011-05-19 13:07:10

相關問題