【问题标题】:xpath query with regex使用正则表达式的 xpath 查询
【发布时间】:2012-04-27 19:43:47
【问题描述】:

很简单,有一个 HTML 文件,还有一个 div 变量 id 像这样

<div id="abc_1"><div>

id 的整数部分是可变的,所以它可以是 abc_892、abc_553 ...等

什么是最好的查询?

【问题讨论】:

标签: php regex xpath


【解决方案1】:
//div[starts-with(@id, "abc_")]

【讨论】:

    【解决方案2】:

    当前接受的答案选择了以下不需要的元素:

    <div id="abc_xyz"/>
    

    但只有这样的div元素必须被接受,其id不仅以"abc_"开头,而且_后面的子字符串是一个整数的表示。

    使用这个 XPath 表达式

    //div
       [@id[starts-with(., 'abc_') 
          and 
            floor(substring-after(.,'_')) 
           = 
            number(substring-after(.,'_')) 
           ]
       ]
    

    这将选择任何具有id 属性的div 元素,其字符串值以字符串"abc_" 开头,并且- 之后的子字符串是整数的有效表示。

    解释

    这里我们使用 XPath 1.0 中的这个 XPath 表达式:

    floor($x) = number($x)
    

    $x 是一个整数时,计算为true()

    这很容易证明:

    1. 如果$x 是整数,则根据定义,上述表达式的计算结果为true()

    2. 1234563但这意味着$x 是一个数字(number($x) 不是NaN),根据定义,等于整数floor($x) 的数字$x 是一个整数。

    替代解决方案

    //div
       [@id[starts-with(., 'abc_') 
          and 
            'abc_' = translate(., '0123456789', '')
           ]
       ]
    

    【讨论】:

    • 你能解释一下为什么会这样吗?我对 xpath 不是很熟悉,所以我猜测 floor() 会返回一个永远不等于自身的值,就像 sql 的三元逻辑一样(例如,sql 中的null = null 总是假的)?谢谢。
    • @chris:完成。顺便说一句,表达式有一点不准确,现在已修复。
    • @chris:不客气。是的,XPath(甚至是 1.0)是一种非常强大的语言和工具,可以提供优雅的解决方案。
    • 好吧,正如我所说,我认为额外的检查可能是不必要的,但我相信它可能对某些人有用。只是出于好奇,//div[@id[translate(.,'0123456789','') = 'abc_']] 会不会更快?
    • @Flynn1179:两种方式都是 O(N)——如果一种方式更快,这将取决于实现。 XPath 引擎优化器可能会也可能不会识别和优化特定的表达式。我更喜欢floor($x) = $x,因为它更具可读性和可理解性,并且可以很好地转化为“类型检查”。
    猜你喜欢
    • 2010-11-18
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多