如何使XPath搜索不区分大小写

13

我目前正在进行xpath搜索,已经使搜索工作正常,但是我需要使它不区分大小写。 我使用的xml文件是1.0版本,据我的研究,这意味着我必须使用称为“translate function”的东西,但我不确定如何做到这一点。

这是我的搜索文件:

$holidayDoc = simplexml_load_file('holidays.xml');      

// fetch data from form
$txtSearch = $_GET['txtSearch'];

$qry = "//channel/item[contains(.,\"$txtSearch\")]";


$holidays = $holidayDoc->xpath($qry);   // do the xpath query 
// now loop through all the students

echo "Showing title search results for $txtSearch";

foreach ($holidays as $holiday) 
{

 echo "<p><a href=\"{$holiday->link}\">{$holiday->title}</a></p>
    <p><small>$holiday->pubDate</small></p>";
任何帮助都将不胜感激,谢谢。

@alain.janinm:目前被接受的答案是错误的--请查看我的回答,了解正确的XPath 1.0和XPath 2.0表达式的解释。 - Dimitre Novatchev
4个回答

18
XPath 1.0 :
$qry = "//channel/item[contains(
 translate(., 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'),  
 translate($search, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'))]"

XPath 2.0:

$qry = "//channel/item[lower-case(.) = lower-case($search)]"

两者都将所有大写字母替换为小写字母。


4

目前被接受的答案存在缺陷——因为没有保证contains()的第二个参数已经转换为小写。

此外,它使用了'$search'——这实际上是字符串"$search"——而不是变量$search

以下是正确的解决方案:

//channel/item
   [contains(translate(., 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz'),
             translate($txtSearch, 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz')
             )
   ]

对应的XPath 2.0表达式:

//channel/item[contains(lower-case(.), lower-case($txtSearch))]

更新:

基于这个解决方案,@alain.janinm已经更正了他的回答。


+1,你说得对,我一直以为第二部分总是小写。 - alain.janinm
当你可以直接传递strtolower($txtSearch)时,在$txtSearch上执行translate()有点愚蠢... - Mladen B.
@MladenB。请注意,OP的问题是要求使用纯XPath 1.0表达式。在XPath 2.0中,可以使用标准的XPath 2.0函数lower-case(),如我所述的答案。 - Dimitre Novatchev
@DimitreNovatchev,我理解OP所要求的内容,但是你的答案有一个额外的部分,在他的情况下真的不需要。如果"$txtSearch"是xpath表达式的参数,那么你可以在XPath之外(在这种情况下是php)对其进行控制。因此,在执行xpath表达式之前,您可以将其转换为小写。 - Mladen B.
@MladenB。如果您坚持将这个问题断章取义,那么您甚至可以使用汇编语言来进行小写处理。这些答案的价值在于它们专注于手头的问题,并提供了OP所请求的信息。 - Dimitre Novatchev

3

从技术上讲,如果要进行大小写不敏感的比较,应该使用大小写不敏感的排序方式,除非您的文本恰好是英文;将两个运算对象规范化为大写或小写字母并不能在所有情况下得到正确的结果。不幸的是,在XPath 2.0中,排序名称没有标准化,因此您必须查看产品文档以了解可用的排序方式。


1
不区分大小写的搜索可以使用matches函数,如下所示。
$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]"

查询中的//string[text() [matches(.,'^OK$','i')]]部分使用正则表达式(REGEX)来确定匹配。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接