REGEX : Word Boundary ne prend pas en compte les accents

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

REGEX : Word Boundary ne prend pas en compte les accents

Message le Ven Déc 23, 2011 16:07

Bonjour,

Je viens de réaliser que je possédais un gros problème sur une partie de mon site qui utilisait des expressions régulières complexes.

Je possède à certains endroits du site un code de ce type (il s'agit d'un exemple, il n'est normalement pas du tout comme ça) :
Code: Tout sélectionner
preg_replace("#(\b|>)". preg_quote("étaux", "#")."(?![^<]*>)\b#i", '$1<b>remplacement</b>', $contenu)


Ce preg replace fonctionne normalement très bien dans tous les cas, excepté quand le mot à remplacer (étaux en l'occurrence) commence ou termine par un caractère accentué. Normalement, la fonction devrait remplacer toutes les occurences de "étaux" par "<b>remplacement</b>" dans $contenu. Il ne le fait cependant pas, mais cela fonctionne quand je remplace "étaux" par des mots du type "phare" ou "tête" (donc pas d'accent, ou uniquement à l'intérieur).

Après de longues recherche, je me suis aperçu que le problème provenait de \b, word boundary : il considère en effet les caractères accentués comme des caractères non-alphanumériques, au même titre que les points, les espaces, etc.

Après recherche, je me suis aperçu que je n'étais pas le seul dans ce cas mais que presque personne n'avait l'air d'être vraiment dérangé par ce comportement (ou plutôt ce bug), à part ici : http://www.infowebmaster.fr/forum/autres-langages/expressions-regulier ... cents-292/

La proposition faite dans le topic cité ne me convient pas vraiment car n'est pas très pratique d'implémentation, pas très propre et risque de ralentir mes scripts car il s'agit de dizaines de milliers de remplacements à faire.

Je souhaitais donc me renseigner sur ce problème, savoir si vous connaissiez une issue ou un autre moyen.

Merci d'avance,

7804j

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2687
Inscription: 13 Fév 2004

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Sam Déc 24, 2011 15:51

C'est probablement juste une histoire de "désaccord" sur le jeu de caractères. Si tu es en UTF-8, un simple flag "u" pourrait suffire.

Jacques.

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Sam Déc 24, 2011 17:42

Oui, j'y avais aussi pensé et j'ai donc essayé de rajouter le flag u au i mais cela ne fonctionne pas non plus :/

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2687
Inscription: 13 Fév 2004

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Dim Déc 25, 2011 1:22

Tu es en quoi? UTF-8? ISO-8859-1? Tu as essayé de manipuler mb_internal_encoding, mb_regex_encoding...?

Jacques.

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Dim Déc 25, 2011 23:28

Oui je suis en UTF-8 mais je n'ai a priori pas touché à ces fonctions.


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Lun Déc 26, 2011 13:10

Beware that \b may not necessarily be Unicode aware:

<?php
echo preg_replace('/\\b/u', '#', 'gonzález');
?>

... prints "#gonzález#" or "#gonz#á#lez#" depending on the platform. (It appears to work as expected in latest PHP versions.)



upgrade ton php...


WebRankInfo
Administrateur du site
Administrateur du site
 
Messages: 19420
Inscription: 19 Avr 2002

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Lun Déc 26, 2011 17:34

Est-ce que \s n'irait pas ? comme dans les regex pour la longue traine

jcaron
WRInaute accro
WRInaute accro
 
Messages: 2687
Inscription: 13 Fév 2004

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Lun Déc 26, 2011 18:04

\s est beaucoup plus restrictif que \b, il ne gèrerait pas la ponctuation ou les débuts/fins de chaîne.

C'est clairement un problème de version de php et/ou de configuration pour que php reconnaisse bien le jeu de caractères utilisé.

Jacques.


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Lun Déc 26, 2011 18:40

pour avoir testé avec du 5.3.3 et du 5.2.1 seule la dernière version gère le cas gonzalès

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Jeu Jan 05, 2012 15:08

Désolé de cette réponse tardive et merci de vos propositions.

Ce n'est apparemment pas une question de version de php puisque celui-ci a toujours été 5.3.3. Pour ce qui est de la configuration, je ne sais pas de quel côté regarder pour voir si c'est bien configuré : que dois-je chercher dans le php.ini ?

J'ai essayé le test du Gondalez sur mon serveur :
Code: Tout sélectionner
echo preg_replace('/\\b/u', '#', 'gonzález');


Et c'est m'a donné :

Code: Tout sélectionner
#gonz#á#lez#


Qu'en pensez-vous ?


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Jeu Jan 05, 2012 16:09

autant pour moi :

PHP 5.3.3-7+squeeze3 with Suhosin-Patch (cli) (built: Jun 28 2011 08:24:40)
=> #gonz#á#lez#


PHP 5.3.6-13ubuntu3.2 with Suhosin-Patch (cli) (built: Oct 13 2011 23:09:42)
=> #gonzález#

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Jeu Jan 05, 2012 16:29

Ah, désolé, j'ai cru que 5.3.3 était la dernière version.

J'ai essayé un apt-get update et un apt-get install php5, mais il n'a pas l'air de se mettre à jour et j'ai toujours cette version :
PHP Version 5.3.3-7+squeeze3

Comment devrais-je m'y prendre pour le mettre à jour sans risque ?


julienr
WRInaute impliqué
WRInaute impliqué
 
Messages: 913
Inscription: 5 Aoû 2003

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Jeu Jan 05, 2012 18:20

en rajoutant une source :

http://www.dotdeb.org/category/php/

7804j
WRInaute discret
WRInaute discret
 
Messages: 104
Inscription: 20 Avr 2011

Re: REGEX : Word Boundary ne prend pas en compte les accents

Message le Jeu Jan 05, 2012 18:34

Merci, ça a l'air de fonctionner maintenant :)


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités