-{
- // Si il n'y a pas de mot, on sort immédiatement
- if ( $sIn === '' ) return ' ';
- // On met tout en minuscule
- $sIn = strtoupper( $sIn );
- // On supprime les accents
- global $uc_convert;
- $accents = $uc_convert;
- $accents['Ç'] = 'S';
- $accents['¿'] = 'E';
- $sIn = strtr( $sIn, $accents);
- // On supprime tout ce qui n'est pas une lettre
- $sIn = preg_replace( '`[^A-Z]`', '', $sIn );
- // Si la chaîne ne fait qu'un seul caractère, on sort avec.
- if ( strlen( $sIn ) === 1 ) return $sIn . ' ';
- // on remplace les consonnances primaires
- $convIn = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'CA', 'CO', 'CU', 'Q', 'CC', 'CK' );
- $convOut = array( 'KI', 'KE', 'KA', 'KO', 'K', 'KA', 'KO', 'KU', 'K', 'K', 'K' );
- $sIn = str_replace( $convIn, $convOut, $sIn );
- // on remplace les voyelles sauf le Y et sauf la première par A
- $sIn = preg_replace( '`(?<!^)[EIOU]`', 'A', $sIn );
- // on remplace les préfixes puis on conserve la première lettre
- // et on fait les remplacements complémentaires
- $convIn = array( '`^KN`', '`^(PH|PF)`', '`^MAC`', '`^SCH`', '`^ASA`', '`(?<!^)KN`', '`(?<!^)(PH|PF)`', '`(?<!^)MAC`', '`(?<!^)SCH`', '`(?<!^)ASA`' );
- $convOut = array( 'NN', 'FF', 'MCC', 'SSS', 'AZA', 'NN', 'FF', 'MCC', 'SSS', 'AZA' );
- $sIn = preg_replace( $convIn, $convOut, $sIn );
- // suppression des H sauf CH ou SH
- $sIn = preg_replace( '`(?<![CS])H`', '', $sIn );
- // suppression des Y sauf précédés d'un A
- $sIn = preg_replace( '`(?<!A)Y`', '', $sIn );
- // on supprime les terminaisons A, T, D, S
- $sIn = preg_replace( '`[ATDS]$`', '', $sIn );
- // suppression de tous les A sauf en tête
- $sIn = preg_replace( '`(?!^)A`', '', $sIn );
- // on supprime les lettres répétitives
- $sIn = preg_replace( '`(.)\1`u', '$1', $sIn );
- // on ne retient que 4 caractères ou on complète avec des blancs
- return substr( $sIn . ' ', 0, 4);
+{
+ static $convVIn, $convVOut, $convGuIn, $convGuOut, $accents;
+ if (!isset($convGuIn)) {
+ global $uc_convert, $lc_convert;
+ $convGuIn = array( 'GUI', 'GUE', 'GA', 'GO', 'GU', 'SC', 'CA', 'CO', 'CU', 'QU', 'Q', 'CC', 'CK', 'G', 'ST', 'PH');
+ $convGuOut = array( 'KI', 'KE', 'KA', 'KO', 'KU', 'SK', 'KA', 'KO', 'KU', 'K', 'K', 'K', 'K', 'J', 'T', 'F');
+ $convVIn = array( '/E?(AU)/', '/([EA])?[UI]([NM])([^EAIOUY]|$)/', '/[AE]O?[NM]([^AEIOUY]|$)/',
+ '/[EA][IY]([NM]?[^NM]|$)/', '/(^|[^OEUIA])(OEU|OE|EU)([^OEUIA]|$)/', '/OI/',
+ '/(ILLE?|I)/', '/O(U|W)/', '/O[NM]($|[^EAOUIY])/', '/(SC|S|C)H/',
+ '/([^AEIOUY1])[^AEIOUYLKTP]([UAO])([^AEIOUY])/', '/([^AEIOUY]|^)([AUO])[^AEIOUYLKTP]([^AEIOUY1])/', '/^KN/',
+ '/^PF/', '/C([^AEIOUY]|$)/',
+ '/C/', '/Z$/', '/(?<!^)Z+/', '/ER$/', '/H/', '/W/');
+ $convVOut = array( 'O', '1\3', 'A\1',
+ 'E\1', '\1E\3', 'O',
+ 'Y', 'U', 'O\1', '9',
+ '\1\2\3', '\1\2\3', 'N',
+ 'F', 'K\1',
+ 'S', 'SE', 'S', 'E', '', 'V');
+ $accents = $uc_convert + $lc_convert;
+ $accents['Ç'] = 'S';
+ $accents['¿'] = 'E';
+ }
+ // Si il n'y a pas de mot, on sort immédiatement
+ if ( $sIn === '' ) return ' ';
+ // On supprime les accents
+ $sIn = strtr( $sIn, $accents);
+ // On met tout en minuscule
+ $sIn = strtoupper( $sIn );
+ // On supprime tout ce qui n'est pas une lettre
+ $sIn = preg_replace( '`[^A-Z]`', '', $sIn );
+ // Si la chaîne ne fait qu'un seul caractère, on sort avec.
+ if ( strlen( $sIn ) === 1 ) return $sIn . ' ';
+ // on remplace les consonnances primaires
+ $sIn = str_replace( $convGuIn, $convGuOut, $sIn );
+ // on supprime les lettres répétitives
+ $sIn = preg_replace( '`(.)\1`', '$1', $sIn );
+ // on réinterprète les voyelles
+ $sIn = preg_replace( $convVIn, $convVOut, $sIn);
+ // on supprime les terminaisons T, D, S, X (et le L qui précède si existe)
+ $sIn = preg_replace( '`L?[TDSX]$`', '', $sIn );
+ // on supprime les E, A et Y qui ne sont pas en première position
+ $sIn = preg_replace( '`(?!^)Y([^AEOU]|$)`', '\1', $sIn);
+ $sIn = preg_replace( '`(?!^)[EA]`', '', $sIn);
+ return substr( $sIn . ' ', 0, 4);