Page 1 sur 2

Expressions régulières et accents & cédilles

Posté : 12 mars 2007, 17:05
par abelthorne
Bonjour,
Je suis en train de bosser sur un formulaire en PHP et je teste la valeur des champs via des expressions régulières.
J'ai notamment une fonction qui teste l'expression suivante : "^[A-Za-z' -]+$" (caractères de A à Z, en minuscules/majuscules, apostrophe, espace et trait d'union).
En faisant mes tests, je me suis aperçu que si j'avais une cédille dans le mot testé ("Besançon"), il ne remplissait pas les conditions de l'expression régulière. En remplaçant la cédille par un caractère accentué ("Besanéon"), idem. Ça m'a paru assez curieux.
Par contre, si j'ajoute n'importe quel caractère accentué à la fin de mon expression ("^[A-Za-z' -à]+$", par exemple), les accents et les cédilles sont alors correctement reconnus !?

Est-ce qu'il y a une explication à cela ? est-ce une mauvaise compréhension de ma part concernant les expressions régulières ? un problème avec PHP ? un paramètre à régler pour que les expressions régulières prennent en compte tous les caractères des langues latines (accents, cédilles, ß allemand, etc.) ? un problème lié au charset de ma page ?

Posté : 13 mars 2007, 00:01
par AB
Bonsoir,

Une bonne adresse pour bien débuter avec les expressions régulières http://www.siteduzero.com/tuto-3-168-1- ... e-1-2.html

Posté : 13 mars 2007, 00:27
par abelthorne
Merci pour le lien, mais je ne crois pas que ça réponde à mon problème. Et j'avais déjà un peu de doc sur les expressions régulières.

Ça ne me dit pas si les caractères spéciaux dont je parles (à / é / è / ù / ç / etc.) sont censés appartenir à la plage [a-z] ou non, ni pourquoi en rajoutant apparemment n'importe lequel à la fin de mon expression elle se vérifie alors pour tous.

Posté : 13 mars 2007, 00:32
par jojolapine
Ça ne me dit pas si les caractères spéciaux dont je parles (à / é / è / ù / ç / etc.) sont censés appartenir à la plage [a-z] ou non, ni pourquoi en rajoutant apparemment n'importe lequel à la fin de mon expression elle se vérifie alors pour tous.
On voit bien içi: http://www.expreg.com/ancrages.php que non...
Après, pour savoir d'où vient ce bug... ? je ne sais pas :)

Posté : 13 mars 2007, 08:47
par raptor
Essaye en passant le à avant le trait d'union dans ton masque ;)

Posté : 13 mars 2007, 09:58
par abelthorne
On voit bien içi: http://www.expreg.com/ancrages.php que non...
Mouais. Je suis pas vraiment convaincu. Ça ne dit pas vraiment si les caractères spéciaux sont bien exclus de la plage [a-z]. Les docs ne les mentionnent jamais et je ne sais pas trop si leur appartenance est implicite ou non.
Par contre, je vais tester ":alpha:" pour voir s'ils sont reconnus avec.
Essaye en passant le à avant le trait d'union dans ton masque
Oh, ce n'est pas vraiment le problème, en fait : peu importe la position du "à" dans l'expression, c'est plutôt sa présence ou non qui me pose quelques soucis ; je cherche juste à savoir si c'est normal d'avoir à mettre un caractère un peu au hasard pour faire reconnaître n'importe lequel d'une certaine plage, si par mesure de sécurité je devrais tous les préciser dans la regexp, etc.

Je suis en train de faire quelques recherches et il semblerait bien que ces caractères soient exclus (j'ai trouvé un exemple où quelqu'un rajoute "(uml|acute|grave|circ|tilde|cedil|ring)" dans une expression), mais je trouve vraiment bizarre l'aspect "je rajoute un accent et la cédille est reconnue" que j'ai pu tester. :?

Posté : 13 mars 2007, 10:16
par raptor
je crois que tu n'as pas compris ce que je veux dire. Il faut que ton "à" soit avant le "-", sinon tout ce qui ne contient pas "à" est vrai.
Enfin perso je viens de tester et ca marche tout a fait en faisant le masque comme ca : "^[A-Za-z' à-]+$"

Posté : 13 mars 2007, 11:06
par jojolapine
je viens de faire quelques essais içi
et bien les résultats ne sont pas ceux que tu indiques...
Dans mon premier masque, j'ai un à, mais le ç n'est pas pris en compte...Tandis que dans le second... j'ai mis quelques caractères accentué, dont le ç, et la capture pour basançon fonctionne

Posté : 13 mars 2007, 11:12
par raptor
<?php
$masque = "^[A-Za-z' à-]+$";
$str = "toto' é";
if (ereg($masque,$str)) echo "Vrai";
else echo "Faux";
?>
Remplace la valeur de $str, ca fonctionne bien pour les chaines ayant "à" , mais ca fonctionne pas sur "besançon". Si par contre tu rajoutes "ç" dans le masque, ca fonctionne.

Posté : 13 mars 2007, 11:13
par abelthorne
je crois que tu n'as pas compris ce que je veux dire. Il faut que ton "à" soit avant le "-", sinon tout ce qui ne contient pas "à" est vrai.
Enfin perso je viens de tester et ca marche tout a fait en faisant le masque comme ca : "^[A-Za-z' à-]+$"
Mmm... Personnellement, si je mets le "à" avant ou après le tiret, il n'y a aucune différence au niveau de mes tests (ce qui me semble logique étant donné que le caractère de rejet est le ^). Par contre, si je ne mets pas le "à" du tout (ou "é" ou autre), tous les caractères accentués sont rejetés.
Remplace la valeur de $str, ca fonctionne bien pour les chaines ayant "à" , mais ca fonctionne pas sur "besançon". Si par contre tu rajoutes "ç" dans le masque, ca fonctionne.
Bizarre, ça ne semble pas marcher de la même façon de mon côté. Est-ce que ce serait ma config PHP en local qui pose problème ?

Posté : 13 mars 2007, 11:15
par jojolapine
regarde l'url que j'ai mis plus haut... :roll:

Posté : 13 mars 2007, 11:19
par abelthorne
regarde l'url que j'ai mis plus haut... :roll:
J'ai regardé, justement, et je crois bien que les résultats ne sont pas les mêmes chez moi.
Je vais regarder ça plus en détail quand j'aurai réussi à reprendre le fil de la discussion. :)

EDIT : petite question : que signifie "(ne pas oublier les délimiteurs pour les pcre!)" concernant la fonction ereg ? C'est justement avec elle que je teste mes expressions et aucune de celles que je rentre sur ton site ne me donne de résultats.

EDIT 2 : au temps pour moi concernant la position de "à" dans ma chaîne : ça ne marche effectivement que si je le place après le tiret (il doit être considéré comme fin de plage et ça expliquerait peut-être pourquoi ça me reconnaît alors d'autres caractères accentués).

Posté : 13 mars 2007, 11:39
par raptor
Fait voir le morceau de code concerné ca sera plus simple pour commencer.

Posté : 13 mars 2007, 11:52
par abelthorne
À la base, je veux tester un nom propre, je pars donc du principe qu'il pourra contenir des lettres majuscules et minuscules, un trait d'union, une apostrophe et une espace.
Je teste donc ma chaîne comme suit :

Code : Tout sélectionner

function testenom($chaine){ if(ereg("^[A-Za-z' -]+$",$chaine)) return true; else return false; }
(Je précise que j'ai récupéré la chaîne en question dans un bouquin.)

Tout va bien tant que je n'ai pas de caractères spéciaux. En faisant des tests (sur le terme "Besançon", par exemple), je me suis aperçu qu'avec la présence de la cédille ma fonction me renvoyait "false".
Après, j'ai essayé des caractères accentués, pareil. Comme j'étais en train de tester une chaîne avec un "à" dedans, je l'ai ajouté à la fin et je me suis aperçu que d'un seul coup, la fonction était vérifiée aussi pour les autres caractères accentués et la cédille. D'où mon étonnement et mon message sur le forum.
Seulement, je crois comprendre qu'en fait j'ai rajouté un intervalle entre l'espace et le "à" et que ça a été un peu le hasard que ma fonction marche (je suppose que les autres caractères que j'ai testés étaient dans la plage en question dans le code ASCII).

Donc, je cherche à créer une expression régulière qui teste un nom propre avec toutes les subtilités syntaxiques européennes sans avoir à rajouter tous les caractères spéciaux parce que je risque d'en oublier (sorti des accents grave, aigus, circonflexes, trémas & cécilles, il y a encore des caractères nordiques avec un cercle au-dessus, le tilde sur le n espagnol, etc. ; sans compter qu'il faut alors que je les rajoute en majuscule et minuscule).

Posté : 13 mars 2007, 12:02
par jojolapine
utilise preg_match() pour faire ce que tu veux....