我目前正在进行 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) 来确定匹配项。