REGEX et accents

Eléphant du PHP | 396 Messages

25 juil. 2008, 11:22

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);

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 11:31

Des charsets différents entre la chaine en entrée et le motif ?

Eléphant du PHP | 396 Messages

25 juil. 2008, 11:45

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

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 12:52

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...

Eléphant du PHP | 396 Messages

25 juil. 2008, 14:26

Je ne fais pas çà dans un contexte html mais dans une page php "vierge", histoire de tester quelques trucs.
Ca pourait venir de là?

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 14:32

Quel est l'encodage de tes fichiers ?

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 14:33

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..

Eléphant du PHP | 396 Messages

25 juil. 2008, 14:41

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...

ViPHP
ViPHP | 5924 Messages

25 juil. 2008, 14:50

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.

Eléphant du PHP | 396 Messages

25 juil. 2008, 15:09

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?

ViPHP
ViPHP | 3300 Messages

25 juil. 2008, 15:19

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.
Fait du php depuis que ca existe ou presque :)

Eléphant du PHP | 396 Messages

25 juil. 2008, 15:34

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?

ViPHP
ViPHP | 3300 Messages

25 juil. 2008, 16:24

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)
Fait du php depuis que ca existe ou presque :)