【问题标题】:Compare two string and ignore (but not replace) accents. PHP比较两个字符串并忽略(但不替换)重音符号。 PHP
【发布时间】:2015-02-25 03:39:50
【问题描述】:

我得到(例如)两个字符串:

$a = "joao";
$b = "joão";

if ( strtoupper($a) == strtoupper($b)) {
    echo $b;
}

我希望它是真实的,即使是重音。但是我需要它忽略重音而不是替换,因为我需要它来呼应“joão”而不是“joao”。

我看到的所有答案都将“ã”替换为“a”,而不是使比较为真。我一直在阅读有关对其进行规范化的信息,但我也无法使其正常工作。有任何想法吗?谢谢你。

【问题讨论】:

  • 您可以使用替换函数进行比较,但仍然输出原始字符串
  • @MrBr1ghtSide note 他说他不想替换字符,只比较它们
  • 如果他可以替换它们,他可以比较字符串,因为它们是相同的

标签: php string non-ascii-characters


【解决方案1】:

我想分享一个避免使用 htmlentities 并且不需要手动列出所有字符替换的优雅解决方案。这是this帖子的答案的php翻译。

function removeAccents($str) {
    return preg_replace('/[\x{0300}-\x{036f}]/u',"",normalizer_normalize($str,Normalizer::FORM_D));
}

$a = "joaoaaeeA";
$b = "joãoâàéèÀ";

var_dump(removeAccents($a) === removeAccents($b));

输出:

bool(true)

【讨论】:

    【解决方案2】:

    只需将重音转换为其非重音对应部分,然后比较字符串。我的答案中的功能将为您删除重音。

    function removeAccents($string) {
        return strtolower(trim(preg_replace('~[^0-9a-z]+~i', '-', preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_QUOTES, 'UTF-8'))), ' '));
    }
    
    $a = "joaoaaeeA";
    $b = "joãoâàéèÀ";
    
    var_dump(removeAccents($a) === removeAccents($b));
    

    输出:

    bool(true)
    

    Demo

    【讨论】:

    • 演示链接已损坏,它适用于所有重音字符吗?喜欢 à é è ?
    • 也是带重音符号的大写字母?
    • 更新了答案以使用更多示例字符
    • 但是为什么是 strtolower()?
    • 赞成,很好的答案!但是,不幸的是,此解决方案在以下情况下失败:Ōsugi Sakae。 =\
    【解决方案3】:

    这不是一个普通的 PHP 解决方案,但在这种情况下效果很好,在 MySQL 上运行这个查询:

    SELECT 'joão' = 'joao'
    

    因此,如果您可以访问 mysql,则可以从 PHP 中使用它。

    【讨论】:

    猜你喜欢
    • 2011-01-23
    • 2010-09-28
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多