Maison  >  Questions et réponses  >  le corps du texte

Compare deux chaînes et ignore (mais ne remplace pas) les accents. PHP

<p>J'obtiens (par exemple) deux chaînes : </p> <pre class="brush:php;toolbar:false;">$a = "joao"; $b = "joão" ; if (strtoupper($a) == strtoupper($b)) { écho $b; }</pré> <p>J'espère que c'est vrai même avec l'accent. Cependant, j'en ai besoin pour ignorer les accents plutôt que de les remplacer, car je dois afficher "joão" au lieu de "joao". </p> <p>Toutes les réponses que j'ai vues remplacent "ã" par "a" au lieu de rendre la comparaison vraie. J'ai lu des articles sur la normalisation, mais je n'arrive pas non plus à la faire fonctionner. Des idées? Merci. </p>
P粉476046165P粉476046165446 Il y a quelques jours465

répondre à tous(2)je répondrai

  • P粉068510991

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

    Je souhaite partager une solution élégante qui évite d'utiliser des entités html et ne nécessite pas de lister manuellement tous les remplacements de caractères. Ceci est une traduction php de thispost.

    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));

    Sortie :

    bool(true)

    répondre
    0
  • P粉470645222

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

    Convertissez simplement les symboles accentués en leurs homologues non accentués et comparez les chaînes. La fonction dans ma réponse supprimera les accents pour vous.

    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', '', htmlentities($string, ENT_QUOTES, 'UTF-8'))), ' '));
    }
    
    $a = "joaoaaeeA";
    $b = "joãoâàéèÀ";
    
    var_dump(removeAccents($a) === removeAccents($b));

    Sortie :

    bool(true)

    Démo

    répondre
    0
  • Annulerrépondre