2012-06-22 103 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>

  • 直接子节点(而没有任何中间级)
  • 除非它们是元件选择