我尝试了许多不同的组合,以使其功能结果从“无结果”到简单地产生各种错误。 我想要做的是搜索包含部分单词或数字的网页上的所有指定链接...例如,这有效:
$nodes = $xpath->query('//a[contains(@href, \'sweet\')]/@href');
在href的任何部分搜索包含“sweet”的所有href ...问题是区分大小写的,几乎所有的URL都包含PHP查询字符串,用户名允许在字符串中混合使用大写和小写,所以这是我的许多失败尝试之一,并使查询不区分大小写:
$nodes = $xpath->query('//a[contains(translate(\'ABCDEFGHIJKLMNOPQRSTUVWXYZ\',\'abcdefghijklmnopqrstuvwxyz\'),\'@href\', \'sweet\')]/@href');
我认为我走在正确的轨道上,但语法有误?
答案 0 :(得分:1)
请尝试
$nodes = $xpath->query('//a[contains(translate(@href,
\'ABCDEFGHIJKLMNOPQRSTUVWXYZ\',
\'abcdefghijklmnopqrstuvwxyz\'
),
\'sweet\'
)
]/@href');
代替。
答案 1 :(得分:0)
将fn:contains
与fn: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中的双引号。