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

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

于 2012-04-22T17:00:21.930 に答える
3

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

また、'$search'-を使用します。これは文字通り文字列です"$search"-変数 $searchではありません。

正しい解決策は次のとおりです。

//channel/item
   [contains(translate(., 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz'),
             translate($txtSearch, 
                       'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 
                       'abcdefghjiklmnopqrstuvwxyz')
             )
   ]

対応するXPath2.0式

//channel/item[contains(lower-case(.), lower-case($txtSearch))]

更新

この解決策に基づいて、@alain.janinm彼の答えを修正しました。

于 2012-04-22T15:14:43.563 に答える
1

matches大文字と小文字を区別しない検索では、次のような関数を使用できます。

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

クエリの//string[text() [matches(.,'^OK$','i')]]セクションでは、正規表現(REGEX)を使用して一致を判別します。

于 2015-10-21T03:49:58.593 に答える