REGEX : Word Boundary ne prend pas en compte les accents

WRInaute discret
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:
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
 
WRInaute accro
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.
 
WRInaute discret
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 :/
 
WRInaute impliqué
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...
 
WRInaute accro
\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.
 
WRInaute discret
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:
echo preg_replace('/\\b/u', '#', 'gonzález');

Et c'est m'a donné :

Code:
#gonz#á#lez#

Qu'en pensez-vous ?
 
WRInaute discret
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 ?
 
Discussions similaires
Haut