簡體   English   中英

如何使用 XPath 執行不區分大小寫的搜索並支持非英文字符?

[英]How can I use XPath to perform a case-insensitive search and support non-english characters?

我正在使用以下代碼在 XML 文件中執行搜索:

$result = $xml->xpath("//StopPoint[contains(StopName, '$query')]");

其中 $query 是搜索查詢,StopName 是公交車站的名稱。 問題是,它區分大小寫。

不僅如此,我還可以使用諸如 ÆØÅæøå 之類的非英語字符進行搜索,以返回挪威名稱。

這怎么可能?

In XPath 1.0 (which is, I believe, the best you can get with PHP SimpleXML), you'd have to use the translate() function to produce all-lowercase output from mixed-case input.

為方便起見,我會將其包裝在 function 中,如下所示:

function findStopPointByName($xml, $query) {
  $upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZÆØÅ"; // add any characters...
  $lower = "abcdefghijklmnopqrstuvwxyzæøå"; // ...that are missing

  $arg_stopname = "translate(StopName, '$upper', '$lower')";
  $arg_query    = "translate('$query', '$upper', '$lower')";

  return $xml->xpath("//StopPoint[contains($arg_stopname, $arg_query)");
}

作為一種消毒措施,我將完全禁止或轉義$query中的單引號,因為如果它們被忽略,它們會破壞您的 XPath 字符串。

在 XPath 2.0 中,您可以使用lower-case() function,這是 unicode 感知的,因此它可以很好地處理非 ASCII 字符。

contains(lower-case(StopName), lower-case('$query'))

要訪問 XPath 2.0,您需要 XSLT 2.0 解析器。 例如撒克遜 您可以通過 JavaBridge從 PHP訪問它。

非英文名稱應該不是問題。 只需將它們添加到您的 XPath 即可。 (XML 被定義為使用 Unicode)。

至於不區分大小寫,...

XPath 1.0 包含以下聲明

兩個字符串相等當且僅當它們由相同的 UCS 字符序列組成。

因此,即使在本地名稱上使用顯式謂詞也無濟於事。

XPath 2 包括 map 案例的功能。 例如fn:大寫


附加:使用 XPath 的翻譯 function 應該允許在 XPath 1 中偽造大小寫映射,但輸入需要包括您和您的用戶將需要的每個大小寫代碼點:

"test" = translate($inputString, "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ")

此外:

$xml->xpath("//StopPoint[contains(StopName, '$query')]");

您需要從 $query 中刪除任何撇號字符以避免破壞您的表達式。

在 XPath 2.0 中,您可以將分隔符中使用的引號加倍以將該引號放入字符串文字中,但在 XPath 1.0 中,不可能在字符串中包含分隔符。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM