【问题标题】:PHP compare string with accents and without accentsPHP比较带重音和不带重音的字符串
【发布时间】:2014-05-06 14:59:16
【问题描述】:

是否可以在 PHP 中比较这些字符串:

Æther == AEther == Aether

我想从这个等价中得到一个肯定的结果

我实际上尝试了多种方法,但没有真正成功:

  • 将 Æ 和任何特殊字符替换为 Ae 为 strtr(性能不佳,我宁愿保持字符串不变)

  • 使用 strcmp/strcasecmp,这解决了大写问题,但我仍然无法处理所有 UTF-8 字符

我想要实现的是解析从 json 检索到的元素列表并与其他一些 json 文件匹配,有些可以不同的拼写(utf8 或非 utf8,大写等),所以,现在,我发现这样做的唯一方法是制作第三个这样的 json:

        {
        "match": {
            "name": "Unravel the \u00c6ther"
        },
        "replace": {
            "name": "Unravel the aether"
        }

我用正确的字符串替换了基本字符串,但我想找到一种方法来自动化这个过程。

【问题讨论】:

  • 这可能是可能的,但您必须编写一些代码才能做到这一点。请对此进行研究并告诉我们您已经尝试过什么。
  • 我的错!我刚刚用一些细节编辑了这个问题。
  • 一般良好做法:如果您不想修改原始字符串,请不要使用strtr()str_replace() 来实际更新字符串。检查等价时只需使用该功能..."Test"==str_replace("x","t", "Tesx")
  • 这个来自另一个帖子的答案可能对你有用Answer

标签: php string utf-8


【解决方案1】:

可以使用iconv的音译功能:

iconv('utf8', 'ASCII//TRANSLIT', 'Æther') == 'Aether';

某些 Windows 系统可能需要使用“utf-8”而不是“utf8”。

【讨论】:

  • +1 甚至不知道存在这样的功能。 OP 只需要将它与 strtolower-functionality 结合起来。
  • 我在让它工作时遇到了一些问题。将utf8 切换为UTF-8 修复了它。
【解决方案2】:

您需要编写一个函数来执行此操作。 我给你两个提示:

  • strtolower
  • levenshtein

这两个功能可以让你开始;)

【讨论】:

    【解决方案3】:

    为什么不使用str_replace() 将Æ 替换为AE。然后使用 'strtolower()' 将两个字符串转换为小写并比较...

    【讨论】:

    • 因为你需要做大约 5730 次这样的替换,给予或接受,以获得足够好的覆盖率。大多数替换将涉及您从未见过的字符和语言。对我来说,这听起来不像是一种实用的方法。
    • 公平地说,OP 询问了获得一个特定实例的等价物。他没有问如何为任何可以想象的奇怪字符集做到这一点。
    • @JohnChrysostom 很可能 OP 的例子只是一个例子,而不是唯一的用例
    • 这就是为什么需要更多的解释和他已经尝试过的例子...... ;-)
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多