REGEX : Word Boundary ne prend pas en compte les accents
14 messages
• Page 1 sur 1
- 7804j
- WRInaute discret

- Messages: 104
- Inscription: 20 Avr 2011
REGEX : Word Boundary ne prend pas en compte les accents
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) :
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
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
-

julienr - WRInaute impliqué

- Messages: 913
- Inscription: 5 Aoû 2003
Re: REGEX : Word Boundary ne prend pas en compte les accents
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

- Messages: 19420
- Inscription: 19 Avr 2002
Re: REGEX : Word Boundary ne prend pas en compte les accents
Est-ce que \s n'irait pas ? comme dans les regex pour la longue traine
- jcaron
- WRInaute accro

- Messages: 2687
- Inscription: 13 Fév 2004
Re: REGEX : Word Boundary ne prend pas en compte les accents
\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.
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.
- 7804j
- WRInaute discret

- Messages: 104
- Inscription: 20 Avr 2011
Re: REGEX : Word Boundary ne prend pas en compte les accents
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 :
Et c'est m'a donné :
Qu'en pensez-vous ?
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é

- Messages: 913
- Inscription: 5 Aoû 2003
Re: REGEX : Word Boundary ne prend pas en compte les accents
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

- Messages: 104
- Inscription: 20 Avr 2011
Re: REGEX : Word Boundary ne prend pas en compte les accents
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 ?
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é

- Messages: 913
- Inscription: 5 Aoû 2003
Re: REGEX : Word Boundary ne prend pas en compte les accents
14 messages
• Page 1 sur 1
Lectures recommandées sur ce thème :
- [astuce] prise en compte des accents dans les regex
- [Regex] Classes génériques PCRE et accents
- regex pour rewrit accents et cactères interdits dans un url
- GG prend en compte le .com au lieu du .fr
- mns ne me prend pas en compte
- google prend il en compte la balise <dd> ?
- Google prend il en compte le contenu?
- GG ne prend pas en compte mon UR !!
- Google ne prend pas en compte ma home ??
- Google ne prend en compte que mes descriptions
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités
