匹配字符串与php dom xpath的第一个和最后一个字符

时间:2013-09-04 12:26:16

标签: php dom xpath

我希望匹配以%开头并以%字符结尾的html字符串,方法是用xpath搜索文本。

条件:

  • 字符串以%
  • 开头
  • 字符串以%
  • 结尾
  • 在一个html文档中可以没有或多个匹配
  • 字符串可以包含(但是是可选的)::但至少需要1 在::
  • 之前和之后的字母字符
  • 在第一个和最后一个%字母之间,数字和 - 字符是 允许的。

我得到的最好的是$xpath->query("//*[text()[starts-with(., '%')][substring(., string-length(.) - 1) = '%']]");

但这不起作用。 php Dom的新东西,很难找到我自己的答案。解释非常有价值!

提前致谢!

修改

请参阅下面的评论,在这种情况下,使用preg_match_all是更好的。目前我正在使用以下代码:

preg_match_all('/%{1}[a-zA-Z0-9-]+?(::?[a-zA-Z0-9-]+?)?%{1}/', $string, $match);

接受此模式的改进。

1 个答案:

答案 0 :(得分:0)

这不是XPath的强项 - 您所描述的内容最好由REGEXP引擎处理(在PHP中,可能意味着迭代节点并通过preg_match运行每个节点)。 / p>

尽管如此,这是一个(非常)hacky XPath方法,我认为做你想要的。您可以在 this XMLPlayground 找到有效的演示。

root/node[
    substring(., 1, 1) = '%' and
    substring(., string-length(.)) = '%' and
    not(string-length(translate(substring(., 2, string-length(.)-2), 'abcdefghijklmnopqrstuvwxyz0123456789-:', ''))) and
    (
        (
            contains(., '::') and
            substring(., 2, 1) != ':' and
            substring(., string-length(.)-2, 1) != ':'
        ) or
        not(contains(., '::'))
    )

]