2012-04-22 6 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の表現については私の答えを参照してください。 –

答えて

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

の2番目の引数が既に小文字に変換されていることを保証するものがないため、現在受け入れられている回答には欠陥があります。

また、'$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あなたは正しいです。私は2番目の部分が常に小文字であると思っています。 –

+0

@ alain.janinm:どうぞよろしくお願いいたします。 –

+0

strtolower($ txtSearch)を単に渡すことができるときは、$ txtSearchでtranslate()を実行するのはちょっと馬鹿です... –

3

技術的には、大文字と小文字の比較を行うには、テキストが英語でない限り大文字小文字の区別を使用する必要があります。両方のオペランドを大文字または小文字に正規化しても、すべての状況で正しい結果が得られません。残念ながら、照合名(XPath 2.0)は標準化されていないため、使用可能な照合を確認するために製品のドキュメントを参照する必要があります。

0

大文字小文字を区別しない検索クエリの//string[text() [matches(.,'^OK$','i')]]セクションが一致を決定するために、正規表現(REGEX)を使用するように

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

ようmatches関数を用いて使用することができます。

関連する問題