2012-04-22 64 views
12

我目前正在進行xpath搜索,我有搜索工作,但我需要使其不區分大小寫。我使用的xml文件是1.0,從我的研究意味着我必須使用一些稱爲翻譯功能的東西,但我不確定如何執行此操作。我如何使Xpath搜索不區分大小寫

這裏是我的搜索文件:

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

任何幫助將不勝感激感謝。

+0

@ alain.janinm:當前接受的答案不正確 - 請參閱我的回答以獲取解釋以及正確的XPath 1.0和XPath 2.0表達式。 – 2012-04-22 15:16:15

回答

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

兩個替換全部大寫爲小寫。

3

目前公認的答案是有缺陷的 - 因爲沒有保證的第二個參數是已經轉換爲小寫

同時,它採用'$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已糾正他的回答。

+0

+1你是對的我以爲第二部分總是小寫。 – 2012-04-22 15:48:20

+0

@ alain.janinm:不客氣。 – 2012-04-22 17:03:12

+0

當你只需傳遞strtolower($ txtSearch)... – 2017-11-07 23:30:25

3

從技術上講,除非您的文字恰好是英文,否則您應該使用案例盲目整理。將兩個操作數歸一化爲大寫或小寫在所有情況下都不會給出正確的結果。不幸的是,排序規則名稱(在XPath 2.0中)不是標準化的,因此您必須查看產品文檔以查看可用的排序規則。

0

不區分大小寫的搜索可以使用matches函數像這樣

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

查詢的//string[text() [matches(.,'^OK$','i')]]部使用正則表達式(REGEX)以確定匹配使用。