13

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

4 回答 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)]"

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

于 2012-04-22T08:09:05.377 回答
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已更正了他的答案。

于 2012-04-22T15:14:43.563 回答
3

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

于 2012-04-22T17:00:21.930 回答
1

不区分大小写的搜索可以使用matches这样的函数

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

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

于 2015-10-21T03:49:58.593 回答