Vergleicht zwei Zeichenfolgen und ignoriert Akzente (ersetzt sie jedoch nicht). PHP
P粉476046165
P粉476046165 2023-08-17 16:16:51
0
2
498
<p>Ich erhalte (zum Beispiel) zwei Zeichenfolgen: </p> <pre class="brush:php;toolbar:false;">$a = "joao"; $b = "joão"; if (strtoupper($a) == strtoupper($b)) { echo $b; }</pre> <p>Ich hoffe, dass es trotz des Akzents stimmt. Ich brauche es jedoch, um Akzente zu ignorieren, anstatt sie zu ersetzen, da ich „joão“ anstelle von „joao“ ausgeben muss. </p> <p>Alle Antworten, die ich gesehen habe, ersetzen „ã“ durch „a“, anstatt den Vergleich wahr zu machen. Ich habe über Normalisierung gelesen, aber ich kann es auch nicht zum Laufen bringen. Irgendwelche Ideen? Danke. </p>
P粉476046165
P粉476046165

Antworte allen(2)
P粉068510991

我想分享一个优雅的解决方案,避免使用htmlentities,并且不需要手动列出所有字符替换。这是对这个帖子的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)
P粉470645222

只需将重音符号转换为它们的非重音对应部分,然后比较字符串。我答案中的函数将为您删除重音符号。

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)

演示

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage