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
507
<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粉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 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)
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