suchen

Heim  >  Fragen und Antworten  >  Hauptteil

Vergleicht zwei Zeichenfolgen und ignoriert Akzente (ersetzt sie jedoch nicht). PHP

<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粉476046165P粉476046165457 Tage vor479

Antworte allen(2)Ich werde antworten

  • P粉068510991

    P粉0685109912023-08-18 11:34:44

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

    Antwort
    0
  • P粉470645222

    P粉4706452222023-08-18 10:51:27

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

    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)

    演示

    Antwort
    0
  • StornierenAntwort