2010-11-05 70 views
0

一旦我在foreach中完成了節點轉換,如何獲得$ myContent的副本,並完成所有替換的節點?如何編寫xpath轉換的結果

回聲$ XPath不工作

$myContent ="<h1>This word should not be replaced: test</h1>. 
    But this one should be replaced: Test"; 

@$dom = new DOMDocument; 
@$dom->loadHTML($myContent); 
$xPath = new DOMXPath(@$dom); 
foreach($xPath->query("//text()[contains(.,'test') and not(ancestor::h1)]") as $node) 
{ 
    $node->textContent = "<b>".trim($match[1])."</b>"; 
} 
+2

您可能還想停止@錯誤抑制 - 它確實會影響性能,但會使問題難以跟蹤 – 2010-11-05 21:58:11

回答

0

幾件事情在這裏......

  • $node->textContent = "<b>".trim($match[1])."</b>";因爲你想創建一個元素(<b>)不應該工作,但堅持下去轉換爲父元素的文本內容。除非PHP DOMNode比文檔說得更聰明,否則它不會解析你的標記並創建一個新的元素。你需要用createElement()createTextNode()來做到這一點。
  • 修改每個$node的textContent應修改$dom文檔,但不會影響$myContent。要獲取已修改DOM文檔的字符串序列化,請使用$ dom->saveHTML()。
+0

@LarsH:謝謝。這有很大幫助。任何想法如何從$ dom-> saveHTML()的結果中刪除''包裝? – 2010-11-05 22:10:57

+0

@Scott:你可能會嘗試$ dom.saveXML()(http://us2.php.net/manual/en/domdocument.savexml.php),它不應該添加該包裝。 – LarsH 2010-11-05 22:13:54

+0

謝謝拉爾斯。現在我只需要弄清楚如何將標記值包裝在b標籤中,並且我已經接近完成了。 – 2010-11-05 22:17:26

0

您必須使用$node->nodeValue代替$node->textContent 此外,您還可以在不使用的nodeValue '<b>'。您必須創建DOMElement並將其附加到$ node