比较两个字符串并忽略(但不替换)重音符号。 PHP

时间:2014-12-28 21:12:35

标签: php string non-ascii-characters

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

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

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

我希望即使重音也是如此。但是我需要它忽略重音而不是替换因为我需要它来回应“joão”而不是“joao”。

我见过的所有答案都将“ã”替换为“a”,而不是将比较设为真。我一直在阅读关于它的正常化,但我也无法使其正常工作。有任何想法吗?谢谢。

3 个答案:

答案 0 :(得分:16)

只需将重音转换为非重音计数器部分,然后比较字符串即可。我的答案中的功能将删除你的口音。

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

答案 1 :(得分:0)

它不是一个简单的PHP解决方案,但在这种情况下运行良好,在MySQL上运行此查询:

SELECT 'joão' = 'joao'

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

答案 2 :(得分:0)

我想分享一个优雅的解决方案,它避免使用 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)