用于解析超链接的Xpath不区分大小写的查询

时间:2014-06-15 11:26:40

标签: php xpath hyperlink

我尝试了许多不同的组合,以使其功能结果从“无结果”到简单地产生各种错误。 我想要做的是搜索包含部分单词或数字的网页上的所有指定链接...例如,这有效:

$nodes = $xpath->query('//a[contains(@href, \'sweet\')]/@href');

在href的任何部分搜索包含“sweet”的所有href ...问题是区分大小写的,几乎所有的URL都包含PHP查询字符串,用户名允许在字符串中混合使用大写和小写,所以这是我的许多失败尝试之一,并使查询不区分大小写:

$nodes = $xpath->query('//a[contains(translate(\'ABCDEFGHIJKLMNOPQRSTUVWXYZ\',\'abcdefghijklmnopqrstuvwxyz\'),\'@href\', \'sweet\')]/@href');

我认为我走在正确的轨道上,但语法有误?

2 个答案:

答案 0 :(得分:1)

请尝试

$nodes = $xpath->query('//a[contains(translate(@href, 
                                               \'ABCDEFGHIJKLMNOPQRSTUVWXYZ\',
                                               \'abcdefghijklmnopqrstuvwxyz\'
                                              ), 
                                     \'sweet\'
                                    )
                           ]/@href');

代替。

答案 1 :(得分:0)

fn:containsfn:translate一起使用是错误的方法,这可以通过实现这个简单任务的复杂程度来证明。

如果你有XPath 2.0,你可以使用fn:matches,例如:

$nodes = $xpath->query("//a[matches(@href, 'sweet', 'i')]/@href");

请注意,fn:matches的第三个参数是一些控制表达式求值的标志,在这种情况下我们指定了i,这意味着比较不区分大小写。可以说你的查询也可以简化为:

$nodes = $xpath->query("//a/@href[matches(., 'sweet', 'i')]");

如果您遇到XPath 1.0,那么您可以简单地使用带有两个or表达式的fn:contains表达式,例如:

$nodes = $xpath->query("//a/@href[contains(., 'sweet') or contains(., 'SWEET')]");

同样在XQuery中,您可以使用单引号或双引号,因此为了使代码更具可读性,我使用了单引号,这样您就不需要从PHP代码中转义XQuery中的双引号。