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 翻译。
\nfunction 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));\nRun Code Online (Sandbox Code Playgroud)\n输出:
\nbool(true)\nRun Code Online (Sandbox Code Playgroud)\n