Compare deux chaînes et ignore (mais ne remplace pas) les accents. PHP
P粉476046165
P粉476046165 2023-08-17 16:16:51
0
2
393

J'obtiens (par exemple) deux chaînes :

$a = "joao"; $b = "joão" ; if (strtoupper($a) == strtoupper($b)) { écho $b; } 

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".

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粉476046165
P粉476046165

répondre à tous (2)
P粉068510991

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 dethispost.

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)
    P粉470645222

    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

      Derniers téléchargements
      Plus>
      effets Web
      Code source du site Web
      Matériel du site Web
      Modèle frontal
      À propos de nous Clause de non-responsabilité Sitemap
      Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!