Php: Expressions régulières et accents

Fermé
yveslands Messages postés 7 Date d'inscription samedi 31 janvier 2009 Statut Membre Dernière intervention 29 avril 2014 - 11 janv. 2013 à 03:27
 yveslands - 14 janv. 2013 à 09:23
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 jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
11 janv. 2013 à 13:04
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 samedi 31 janvier 2009 Statut Membre Dernière intervention 29 avril 2014
Modifié par yveslands le 11/01/2013 à 13:29
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
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 423 Date d'inscription samedi 1 décembre 2012 Statut Membre Dernière intervention 22 mai 2018 66
14 janv. 2013 à 09:04
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
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