3

根据我说西班牙语的消息来源,如果我在包含这两个值的字符串列表中搜索模式“pan”:

$normalString = "abcpan123";
$specialString = "abcpañ123";

它应该匹配它们——例如strpos("pan", $normalString)并且strpos("pan", $specialString)都应该返回'3'。

但是,只有第一个返回非假值。

如果我在 mySQL 中对 "like "%pan%" 进行类似的搜索,它会匹配两个字符串。

据推测,这种情况不仅适用于 n-波浪号,还适用于用重音等修饰的其他字符。

我对如何处理这个问题感到困惑......这似乎是其他人必须遇到并解决的问题,但我还没有找到一个好的现有解决方案。我希望在 PHP 中有一些不同的功能,或者某种配置,但没有乐趣。

当然,我可以使用正则表达式而不是使用 strpos() 编写一些自定义代码,但我什至不确定如何在多种外语中确定哪些字符被认为是等效的。

对我有什么帮助吗?

4

1 回答 1

0

strpos按原样比较字符,“n”根本不是“ñ”。事实上它只是比较bytes,它甚至不会意识到不同的编码。如果您想要区域设置和排序规则感知比较,请使用strcoll. 也阅读评论,没有太多关于它的文档。

该数据库包括一个开箱即用的排序规则设置,这使得它可以执行这种模糊搜索。

另一种方法是将所有字符串规范化为纯 ASCII 字符,然后再使用iconv('UTF-8', 'ASCII//TRANSLIT', $string).

于 2012-03-15T01:25:08.403 回答