【问题标题】:How to get strpos in PHP to match foreign language characters?如何在 PHP 中获取 strpos 以匹配外语字符?
【发布时间】:2012-03-15 01:02:17
【问题描述】:

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

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

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

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

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

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

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

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

对我有什么帮助吗?

【问题讨论】:

    标签: php strpos


    【解决方案1】:

    strpos 按原样比较字符,“n”根本不是“ñ”。事实上它只是比较字节,它甚至不会意识到不同的编码。如果您想比较区域设置和 collat​​ion,请使用 strcoll。还要阅读 cmets,关于它的文档并不多。

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

    另一种方法是在使用 iconv('UTF-8', 'ASCII//TRANSLIT', $string) 进行比较之前将所有字符串规范化为纯 ASCII 字符。

    【讨论】:

    • iconv() 调用对我来说非常有用,在 php 命令行脚本中,但当我通过 apache 运行 php 时似乎没有做正确的事情。任何想法为什么?
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-28
    • 2021-09-29
    • 1970-01-01
    相关资源
    最近更新 更多