1

假设我有

<body>
    <p>This is a paragraph</p>
    <p>This is another paragraph, there are three paragraphs in this page</p>
    <p>Lorem ipsum dolor sit amet. Just another paragraph. Ut enim ad minim veniam.</p>
</body>

我想找到与“段落”匹配的所有单词,并在匹配单词之前和之后用 4 个单词将其包围。结果列表如下:

  • 这是一个段落。
  • 这是另一段,共有三段……
  • ...段落,本页共有三个段落。
  • ...坐下来。只是另外几段。Ut enim ad minim...

我是 xpath 的新手,所以我能做的最好的就是这段代码,它将获取所有包含“段落”的文本节点

$test = $xml->xpath('//body//*[text()[contains(.,"paragraph")]]');

结果:

  • 这是一段
  • 这是另一段,本页共有三段
  • Lorem ipsum dolor sit amet。只是另一个段落。Ut enim ad minim veniam。

提前致谢。

4

1 回答 1

2

您提到 PHP 的事实表明您可能正在寻找 XPath 1.0 解决方案。

这里有几个问题:

  • XPath 1.0 没有很好的文本处理能力,无法用用户定义的函数来弥补

    XPath(1.0 或 2.0)无法创建新节点,因此难以返回结构化结果。

如果您坚持使用 PHP,因此使用 XPath 1.0,我想我会满足于将匹配的文本节点返回到 PHP 应用程序,然后在 PHP 中进行其余的处理。

另一种方法是使用 XSLT:在 XSLT 1.0 中这仍然是一个挑战,但借助递归模板,这当然是可能的。

于 2012-05-22T12:57:16.327 回答