如何使Xpath搜索大小写不敏感

时间:2012-04-22 07:56:46

标签: php xml xpath

我正在进行xpath搜索,我已经进行了搜索,但我需要让它不区分大小写。我正在使用的xml文件是1.0,从我的研究意味着我必须使用一些称为翻译函数的东西,但我不确定如何做到这一点。

这是我的搜索文件:

$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>";

非常感谢任何帮助。

4 个答案:

答案 0 :(得分: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)]"

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

答案 1 :(得分:3)

当前接受的答案存在缺陷 - 因为没有任何保证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已经纠正了他的答案。

答案 2 :(得分:3)

从技术上讲,要进行盲区比较,你应该使用盲区整理,除非你的文字恰好是英文;将两个操作数归一化为大写或小写都不会在所有情况下都给出正确的结果。不幸的是,排序规则名称(在XPath 2.0中)没有标准化,因此您必须查看产品文档以查看可用的排序规则。

答案 3 :(得分:0)

不区分大小写的搜索可以使用matches函数,如此

$qry = "//string[text() [matches(.,'^stringImTryingToFind$','i')]]"

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