Php: Expressions régulières et accents

yveslands Messages postés 7 Date d'inscription   Statut Membre Dernière intervention   -  
 yveslands -
Bonjour,
j'ai une fonction qui cherche une sous chaîne de caractères dans une chaîne et la remplace par son équivalent en gras (<strong>$sous_chaine</strong>) grâce à une regex. Le problème est que les accents ne sont pas conservés si la chaîne dans laquelle on effectue la recherche comporte des caractères accentués. J'obtiens une sorte de losanges avec des points d'interrogation à l'intérieur(??).
Quelqu'un pourrait-il m'aider? Merci d'avance

Voici ma fonction:

function highLight($words, $str) {
    $words = preg_split("/[\s,-]+/", $words);
    $highlight = '<strong>$0</strong>';
    $pattern = '#(?!<.*?)(%s)(?![^<>]\p{L}*?>)#i';
    foreach ($words as $word) {
        $word = preg_quote($word);
        $regex = sprintf($pattern, $word); 
        $str = preg_replace($regex, $highlight, $str);
    }
    return $str;
}




A voir également:

5 réponses

Reivax962 Messages postés 3672 Date d'inscription   Statut Membre Dernière intervention   1 011
 
Bonjour,

Une piste : indique que l'expression rationnelle s'applique sur des caractères Unicode avec le modificateur u :

$words = preg_split("/[\s,-]+/u", $words);
$pattern = '#(?!<.*?)(%s)(?![^<>]\p{L}*?>)#iu';

Vérifie également que ton fichier php est bien encodé en UTF-8, de même que le fichier php qui appelle ta fonction.

Xavier
0
yveslands Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour ta réponses mais ça n'a pas fonctionner. j'obtiens tjrs ces bizarres losanges avec des points d'interrogations à l'intérieur.
0
yveslands
 
Ok c bon. les erreurs d'accents apparaissent si $words est vide. une simple condition if avant l'affichage règle ce problème. Mais il en demeure un autre. Quand j'execute le code avec
$text = 'cordoba'

rien ne se passe pourtant il existe 'Córdoba' dans la chaine de recherche. voici ma regex
$pattern = '#(?!<.*?)(%s)(?![^<>]\p{L}*?>)#iu';

est-ce correct?
0
Stanislas Poisson Messages postés 424 Date d'inscription   Statut Membre Dernière intervention   66
 
Tu est en utf8 visiblement. au debut de t'est fichier principeaux, place ce code
mb_internal_encoding('UTF-8');


en le mettant bien sur en adéquation avec ton encodage.

cela permettra d'utiliser les versions mb_ des fonction php tel que mb_strtolower($a,'UTF-8');.

pour la regex, essaye avec

$str=preg_replace($regex,$highlight,utf8_decode($str));
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yveslands
 
Merci pour ta réponse Stanislas. Mais je n'ai plus de problème d'affichage. J'aimerais juste pouvoir mettre les mots qui contiennent des caractères accentués en gras. Comme je le disais tantôt si ma chaîne contient 'Córdoba' rien ne se passe si je fait
highlight('cordoba', $chaîne). j'aimerai que ma regex considère cordoba et Córdoba comme une même chaîne.
Merci
0