Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Xpath选择没有子节点的节点_Php_Html_Xml_Xpath - Fatal编程技术网

Php Xpath选择没有子节点的节点

Php Xpath选择没有子节点的节点,php,html,xml,xpath,Php,Html,Xml,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;">po

我有一个网页,我想通过代码修改(添加特定单词的链接)

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>

诺特尔历史酒店

详细说明词语1998:la création

推动目标,积极推进教育,支持青年和欧盟,支持集体表达和团结行动”(第2条)。

1999-2001年:les débuts specific WORDS

指定单词

所以我的目标是用preg_替换特定的单词,但只替换那些在p中,但在a或STRONG中,或者任何一个标签中的单词

我不能使用任何类或任何id,因为我以前不知道代码! 我尝试了preg_replace PHP函数,但它不起作用,而且执行时间太长

所以我的问题是:
如何使用XPATh选择没有a、STRONG、IMG子节点的节点?

不能选择没有子节点的节点。节点是树的一个子部分,除非它是一片叶子,在这种情况下它没有更多的子节点。要选择包含单词“SPECIFIC”的TextNode叶子,它们是P元素的直接子元素,您需要

//p/text()[contains(.,'SPECIFIC')]
这将排除其他元素内的文本节点,例如,在strong或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();

如果我理解正确,请参见和此

,您希望选择Xml文档中作为
元素直接子元素的所有节点,而不选择中间的任何其他元素。这是可能的,如下所示:

`//p/node()[not(self::*)]`
此表达式选择

  • 在所有
    元素中
  • 直接子节点(不含任何中间级别)
  • 除非它们是元素

  • 我的第一印象是,除非您使用的是XHTML,并且能够保证没有特殊字符(如
    ),否则您将很难通过XPATH进行处理,因为它必须符合XML标准。但是我可能错了(已经知道!)一般来说,选择a中但不在B中的节点的XPath表达式是
    a//node()[不(祖先::B)]
    如果您只想要文本节点,则需要将
    node()
    替换为
    text()