【问题标题】:Xpath to Select nodes without its childrensXpath 选择没有其子节点的节点
【发布时间】:2012-06-24 14:42:21
【问题描述】:

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

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、STRONG、IMG 子节点的节点?

【问题讨论】:

  • 我的第一印象是,除非您使用 XHTML 并且可以保证没有特殊字符(如 &amp;nbsp;),否则您将无法通过 XPATH 进行处理,因为它必须确认 XML 标准。不过我可能是错的(众所周知!)
  • 一般来说,选择一个在A中但不在B中的节点的XPath表达式是A//node()[not(ancestor::B)],如果只需要文本节点,则需要将node()替换为text()。跨度>

标签: php html xml xpath


【解决方案1】:

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

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

这将排除其他元素内的文本节点,例如强或强。

要替换它们,您可以这样做

$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 php 和这个XPath Tutorial

【讨论】:

    【解决方案2】:

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

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

    这个表达式选择

    1. 在所有 &lt;p&gt; 元素中
    2. 直接子节点(没有任何中间层)
    3. 除非它们是元素。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多