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

比较两个字符串并忽略(但不替换)重音符号。PHP,php,string,non-ascii-characters,Php,String,Non Ascii Characters,我得到(例如)两个字符串: $a = "joao"; $b = "joão"; if ( strtoupper($a) == strtoupper($b)) { echo $b; } 我希望它是真实的,即使是重读。但是我需要它忽略重读而不是替换,因为我需要它呼应“joão”而不是“joao” 我看到的所有答案都将“ã”替换为“a”,而不是将比较变成真实的。我一直在读关于规范化它的书,但我也不能让它正常工作。有什么想法吗?多谢各位 只需将重音转换为非重音计数器部分,然后比较字符串。我的

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

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

if ( strtoupper($a) == strtoupper($b)) {
    echo $b;
}
我希望它是真实的,即使是重读。但是我需要它忽略重读而不是替换,因为我需要它呼应“joão”而不是“joao”


我看到的所有答案都将“ã”替换为“a”,而不是将比较变成真实的。我一直在读关于规范化它的书,但我也不能让它正常工作。有什么想法吗?多谢各位

只需将重音转换为非重音计数器部分,然后比较字符串。我的答案中的函数将为您消除重音

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)
bool(true)

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

SELECT 'joão' = 'joao'

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

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

输出:

bool(true)
bool(true)

您可以使用替换函数进行比较,但仍然输出原始stringTry@MrBr1ghtSide注释他说他不想替换字符,只比较字符如果他可以替换字符,他可以比较字符串,因为它们会断开相同的链接,这适用于所有重音字符吗?比如–aéè?还有带重音的大写字母?更新了答案以使用更多示例字符,但为什么使用strtolower()?