![](/img/trans.png)
[英]How can I sanitize a string while maintaining all non-English alphabet support
[英]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.