2012-06-22 124 views
4

我有一個我想通過代碼修改的網頁(在特定單詞上添加鏈接)。Xpath選擇沒有子節點的節點

的HTML代碼:

<div class="section"> 
<h2>Notre histoire</h2> 
<p style="text-align: justify;">SPECIFICS WORDS<strong>1998 : la création</strong></p> 
<p style="text-align: justify;">pour objectif « de promouvoir, selon une démarche d’éducation active, auprès des jeunes et à travers eux, des projets d’expression collective et d’action de solidarité » (article 2).<br><br><strong>1999-2001 : les débuts SPECIFICS WORDS</strong></p> 
<p style="text-align: justify;">SPECIFICS WORDS<a href="#">SPECIFICS WORDS</a></p> 
</div> 

所以我的目標是在的preg_replace特定的詞,但只有那些誰在P,而是出於從A或強,或任何兩種標籤。

我不能使用任何類或任何ID,因爲我不知道代碼之前! 我嘗試了preg_replace PHP函數,但它沒有工作,並且執行時間太長。

所以我的問題是: 如何用XPATh選擇一個沒有A,STRONG,IMG chidrens的節點?

+0

我的第一印象是,除非你使用XHTML和可以保證沒有特殊字符(比如'' ),你將有麻煩通過XPATH來處理,因爲這將有確認符合XML標準。 (可能是錯誤的) – freefaller

+0

一般來說,XPath表達式選擇一個在A中但不在B中的節點是'A // node()[not(ancestor :: B)]'如果你想文本節點,您需要用'text()'替換'node()'。 – biziclop

回答

2

您不能選擇沒有子女的節點。一個節點是樹的一個子部分,除非它是一個葉子,在這種情況下它沒有更多的子節點。要選擇包含單詞「具體」的TextNode葉子這是P元素的直接孩子,你

//p/text()[contains(.,'SPECIFIC')] 

這將排除其他元素,例如內的文本節點在強或a。

要取代他們,你做

$dom = new DOMDocument; 
$dom->loadHTML($html); 
$xpath = new DOMXPath($dom); 
foreach ($xpath->query('//p/text()[contains(.,"SPECIFIC")]') as $textNode) { 
    $textNode->nodeValue = "REPLACED"; 
} 
echo $dom->saveHTML(); 

另見DOMDocument in phpXPath Tutorial

0

如果我理解正確的話,你要選擇的XML文檔中是一個<p>元素的直接子的所有節點,其間沒有任何其他元素。這是可能的,如下所示:

`//p/node()[not(self::*)]` 

此表達式中的所有元素<p>

  • 直接子節點(而沒有任何中間級)
  • 除非它們是元件選擇