使用正则表达式进行xpath查询

时间:2012-04-26 14:40:31

标签: php regex xpath

非常简单,有一个HTML文件,并且有一个像这样的变量id的div

<div id="abc_1"><div>

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

获得它的最佳查询是什么?

2 个答案:

答案 0 :(得分:6)

//div[starts-with(@id, "abc_")]

答案 1 :(得分:2)

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

<div id="abc_xyz"/>

但是只能接受这样的div元素,其id不仅以"abc_"开头,而_后面的子字符串也是整数的表示。

使用此XPath表达式

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

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

<强>解释

这里我们使用的事实是在XPath 1.0中这个XPath表达式:

floor($x) = number($x)

true()为整数时确切地评估为$x

这很容易证明:

  1. 如果$x是一个整数,则上述表达式的定义为true()

  2. 如果上面的表达式求值为true(),这意味着等式的两边都不是NaN,因为根据定义NaN不等于任何价值(包括自身)。但这意味着$x是一个数字(number($x)不是NaN),根据定义,等于整数$x的数字floor($x)是整数。

  3. 替代解决方案

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