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


How do i make Xpath search case insensitive

我目前正在进行 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>";

任何帮助将不胜感激。

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)]"

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

目前接受的答案是有缺陷的——因为没有什么能保证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纠正了他的答案。

从技术上讲,要进行不区分大小写比较,您应该使用不区分大小写的排序规则,除非您的文本恰好是英语; 将操作数规范化为大写或小写并不能在所有情况下给出正确的结果。遗憾的是,排序规则名称(在 XPath 2.0 中)不是标准化的,因此您必须查看产品文档以了解可用的排序规则。

可以使用

matches函数进行不区分大小写的搜索,如下所示

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

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