Page 1 sur 1

REGEX et accents

Posté : 25 juil. 2008, 11:22
par Rei Itchido
Bonjour à tous,

Je voulais savoir ce qui peut faire qu'une regex ne prenne pas en compte les accents

Code : Tout sélectionner

$str = "aa oo éé"; $str = preg_replace("#[[:alpha:]]#", "p", $str); echo $str"; // me donne pp pp éé
Même résultat avec

Code : Tout sélectionner

preg_replace("#[\w]#", "p", $str);

Posté : 25 juil. 2008, 11:31
par Sékiltoyai
Des charsets différents entre la chaine en entrée et le motif ?

Posté : 25 juil. 2008, 11:45
par Rei Itchido
Hmmmm
C'est-à-dire? Je dois vérifier quoi?

Sachant que ça, fonctionne :

Code : Tout sélectionner

$str = "aa oo éé"; $str = preg_replace("#é#", "p", $str); echo $str"; // me donne aa oo pp

Posté : 25 juil. 2008, 12:52
par Sékiltoyai
Tu dois vérifier le charset des données entrantes, c'ets à dire est ce que tu déclares tes pages html en utf8, et est ce que tu écris tes scripts en utf8...

Posté : 25 juil. 2008, 14:26
par Rei Itchido
Je ne fais pas çà dans un contexte html mais dans une page php "vierge", histoire de tester quelques trucs.
Ca pourait venir de là?

Posté : 25 juil. 2008, 14:32
par Sékiltoyai
Quel est l'encodage de tes fichiers ?

Posté : 25 juil. 2008, 14:33
par Sékiltoyai
Ah non, au temps pour moi, je n'avais pas lu la question correctement.
Les caractères accentués ne sont pas considérés comme des caractères alphabétiques. :)

Désolé de t'avoir mené sur une fausse piste..

Posté : 25 juil. 2008, 14:41
par Rei Itchido
Me revoilà au point de départ alors :)

\w ou :alpha: sont censés capturer les caractères alphabétiques + les caractères accentués

Si quelqu'un a une piste...

Posté : 25 juil. 2008, 14:50
par Sékiltoyai
La définition des lettres et chiffres est définie par les tables de caractères de PCRE, et peut varier suivant la table locale de caractères.

Posté : 25 juil. 2008, 15:09
par Rei Itchido
Oui je viens de voir ça.
J'ai un peu de mal, comment peut-on savoir la table des caractères utilisée? Et comment la modifier?

Posté : 25 juil. 2008, 15:19
par Nagol
géré sur irc :)

à prioris la première idée de sékil est la bonne, il s'agit d'une différence de charset. en utf8 certains caractères sont encodés sur plusieurs bytes posant de gros problèmes pour les opérations en rapport avec les chaines (strlen, strcmp, regexp diverses etc) la solution étant de jongler avec les fonctionalités multibyte proof de l'extension mb de php http://www.php.net/mb en remplacement.

Posté : 25 juil. 2008, 15:34
par Rei Itchido
Continuons ici, ça pourra toujours servir à d'autres si tu veux bien :)

Tu veux donc dire que ma chaîne est encodée en utf8 dont certains caractères sont encodés sur plus d'un byte ce qui pose des problèmes avec certaines fonctions sur les chaînes (j'ai bon?)

Parcontre mon fichier est encodé en iso, ça ne devrait pas fonctionner?

Posté : 25 juil. 2008, 16:24
par Nagol
le soucis est que php a son propre encodage (configurable dans le php.ini) que le nom de ton fichier ou le noms de tes fichiers peut etre d'un encodage différent de son contenu, j'en passe et des meilleurs. Comme je disais sur IRC un des plus gros downside de l'univers linux/unix.

un des gros problème relatif aux charset c'est qu'il n'est à prioris pas possible de détecter un charset autrement qu'en testant son affichage (pacool quand on a un soucis) si tu as le contrôle sur l'encodage des noms de fichiers et des fichiers de ton système le mieux est de s'assurer qu'ils sont tous sur le même charset en les réencodant (à coup de iconv) et de s'assurer que la configuration des différents services relatifs au fichiers soit unifiée (système, sgbd, ftp, éditeurs, samba, etc)