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

Pen*_*nny 7 php string non-ascii-characters

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

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

if ( strtoupper($a) == strtoupper($b)) {
    echo $b;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Joh*_*nde 18

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

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));
Run Code Online (Sandbox Code Playgroud)

演示


小智 5

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

\n
function removeAccents($str) {\n    return preg_replace(\'/[\\x{0300}-\\x{036f}]/u\',"",normalizer_normalize($str,Normalizer::FORM_D));\n}\n\n$a = "joaoaaeeA";\n$b = "jo\xc3\xa3o\xc3\xa2\xc3\xa0\xc3\xa9\xc3\xa8\xc3\x80";\n\nvar_dump(removeAccents($a) === removeAccents($b));\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
bool(true)\n
Run Code Online (Sandbox Code Playgroud)\n