繁体   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