Xpath 以选择没有其子节点的节点


Xpath to Select nodes without its childrens

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

该 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 或 STRONG,或任何任一标签的单词。

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

所以我的问题是:如何使用XPATh选择没有其A,强,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();

另请参阅 PHP 中的 DOMDocument 和此 XPath 教程

如果我

理解正确,您希望选择 Xml 文档中作为<p>元素的直接子级的所有节点,中间没有任何其他元素。这可能如下:

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

此表达式选择

  1. 在所有<p>元素中
  2. 直接子节点(没有任何中间级别)
  3. 除非它们是元素。