regex et les caractères accentués

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : regex et les caractères accentués

par BeRoots » 12 déc. 2007, 19:15

merci j'ai fini par faire ce que je voulai pour mes p'tits filtres ;)

bientot je verrai pour passer par PEAR PERL et compagnie car il y a des classes qu'il me reste à découvrir et qui on l'air interesante tout plein. je rgarderai aussi sur ce qu'il en ai de la fonction filter_var ...

merci de vos aides divers :)
BeRoots, sortie de son calvaire, veut encore voir plus loin :)

par titerm » 12 déc. 2007, 18:37

Plutot que d'utiliser / comme début et fin de regex, utilise un caractère qui n'est pas présent dans la regexp. ² ou ! par exemple

par Sékiltoyai » 12 déc. 2007, 16:46

Pour le second comportement, tu dois t'assurer que le / reste échappé par \\. Pour le premier, c'est plutôt illogique…

par AB » 12 déc. 2007, 16:36

Cette regex est faite pour valider une adresse email, pas pour détecter une adresse email dans un texte.

Faudrait donc faire une regex pour détecter les mail ou ce qui y ressemble - assez simple puisqu'il s'agit de détecter tous les caractères collés à @ jusqu'au prochain espace - et ensuite de passer en revue le tableau des résultats $reg[1] avec la regex de validation.

par BeRoots » 12 déc. 2007, 15:56

merci je connaissais l'extention filter mais je souhaite allez encore plus loin et je me suis deja créé une classe de filtre (antispam censure injection et validation) avec des tonne de filtre :)

par contre pour reprendre mon expression precedente, j'ai un soucis d'utilisation de cette regex sur des contenu de grande longueur :-k
/^[-a-z0-9!#$%&'*+\\/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+\\/=?^_`{|}~]+)*@(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){2,63}$/i

en faite, cette regexp marche à merveille pour ce qui est du controle sur un champ email de formulaire mais j'ai ce message d'erreur quand à l'utilisation pour détecter une adresse email dans un contenu plus grand :?
Warning: preg_match() [function.preg-match]: Unknown modifier '=' in C:\~monfichier.php on line 642
Si je déplasse les / dans la regex pour les mettre en fin de classe par exemple, j'ai le message suivant:
/^[-a-z0-9!#$%&'*+\\=?^_`{|}~/]+(\.[-a-z0-9!#$%&'*+\\=?^_`{|}~/]+)*@(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){2,63}$/i
Warning: preg_match() [function.preg-match]: Unknown modifier ']' in C:\~monfichier.php on line 642
si quelqu'un peut me dire pourquoi mon preg_match me renvoi cette erreur pour les recherches dans un contenu de plus de 1 mot et ne le fait pas pour ce qui est du même test sur une adresse email uniquement ?
Merci d'avance ;)

par Xenon_54 » 12 déc. 2007, 08:52

As-tu une version récente de PHP5? (PHP 5 >= 5.2.0)

L'extension Filter peut t'être utile:
http://www.php.net/manual/fr/ref.filter.php

Exemple:
http://phpro.org/tutorials/Filtering-Da ... HP.html#10

par BeRoots » 11 déc. 2007, 20:56

moi je vient de trouver ceci sur http://atranchant.developpez.com/code/validation/ (EDIT. idem que AB)

j'ai utilisé la regex suivante qui respecte les normes RFC2822 & RFC1035:
/^[-a-z0-9!#$%&'*+\\/=?^_`{|}~]+(\.[-a-z0-9!#$%&'*+\\/=?^_`{|}~]+)*@(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){2,63}$/i
Apparament elle fonctionne bien, il ne me reste plus qu'a tester les MX...

seul question qu'il me reste, quel est la longueur maximum d'une adresse email ?
moi j'enregistre dans un varchar(255) en crypter donc suivant mon calcul je devrai estimer la longueur maxi afin de voir si le type varchar est suffisant pour moi :-k

si quelqu'un a une idée sur la longueur maxi d'une email email :)
merci d'avance ;)
BeRoots, rtourne mettre le nez dans les normes...

DE RETOUR:

je vient de faire le tour de differente norme sur l'email et rien n'est specifier quant à la longueur de l'email :(
j'ai juste pus remarquer que la longueur de nom de domaine maxi est de 63 caractères (+ le @ sa fait donc 64 caractères)
sitôt après j'ai été chez gmail et j'ai vue qu'il ne bride pas via un maxlength leur champ pour definir le "nom d'email" (post @) donc sans doute illimité tant dans les norme que via les fournisseur d'adresse de messagerie :?

je suppose donc devoir estimer ceci moi même en gardans de la marge...(genre 120 char pour moi sa à l'air pas mal)

par AB » 11 déc. 2007, 20:39

Sinon tu pourrais t'inspirer des regex déjà faits pour valider les mails.

J'utilise la première solution de ce lien très bien documenté :
http://atranchant.developpez.com/code/validation/

par Hywan » 11 déc. 2007, 18:14

Pour ça, il faudrait voir dans les RFCs. De mémoire il faut voir la RFC 882 pour les noms de domaines. L'expression régulière donnée dans une autre RFC pour la forme des mails est :

Code : Tout sélectionner

#^([a-z0-9_\-\.]+)@([a-z0-9_\-\.]+)\.([a-z]{2,6})$#i
il me semble. Je vais chercher le numéro de la RFC dans laquelle j'avais trouvé ça.

(ellipse temporelle)

Ah je me souviens pourquoi j'avais appelé mon paquetage RFC882. La meilleure façon de tester une adresse email est de la tester. Donc on se connecte au serveur MX etc (tout est expliqué dans la RFC 882).

Pour répondre à ta question donc, il n'y a pas de caractères spéciaux (à part . _ - et @), et les majuscules n'ont pas d'importances dans les mails.


Edition : si tu veux que je te liste la démarche à suivre pour valider un mail, demandes moi.

par BeRoots » 11 déc. 2007, 17:57

pour c qui est du drapeau i, il n'y est pas. Ma regex est bien la même que celle precisé ici (cf. j'ai modifier pour .museum, merci ;)):
#^[^-_\.][-_\.a-z0-9]+[^-_\.]@[^-_\.][-_\.a-z0-9]+[^-_\.]\.[a-z]{2,6}$#

j'ai aussi apporter les modifications sur le - que j'ai glisser en debut de classe pour ne plus avoir de problème (comme preciser dans la doc sur les regexp) ;)

ma regexp est maintenant correct mais le bug vennai en faite du testeur de regexp de chez http://www.lumadis.be . Je m'en vait de ce pas prevenir notre cher Ripat d'ailleur ;)

dernière question quand même: quel sont les caractères spéciaux et est ce que le Majuscule sont autoriser pour les adresses emails?

merci d'avance ;)

par titerm » 11 déc. 2007, 16:33

pour les accents , essai la notation posix [:alpha:], si tu as le local correct, il me semble qu'il gère les accent

[:alnum:] <=> [a-zA-Z0-9]
[:alpha:] <=> [a-zA-Z]
[:lower:] <=> [a-z]
[:word:] <=> [A-Za-z0-9_]


Pour la case, un email n'est pas sensitif, tu devrais donc accepter les minuscule, majuscule...

A mon avis, ton pb pour les maj viens du fait que tu as des - non placé en fin de list, et du coup, tu définis peut etre une classe de char sans le vouloir.

par Hywan » 11 déc. 2007, 16:22

Quand tu utilises l'ensemble [a-z], cela signifie : de a à z, donc [a, b, c, d, e, f ..., x, y, z]. Ce qui ne comprend pas les caractères accentués. Les caractères accentués, comme les majuscules sont en dehors de cet ensemble. Donc pour les caractères accentués, je ne sais pas.
Pour les majuscules en revanche, l'utilisation d'un fly tag à la fin, peut changer la donne. Il me semble que c'est le drappeau i qui rend la case insensible en PCRE. Vérifie que tu ne l'as pas.

Et attention au .museum, qui compte 6 caractères, et pas 4 (revoir ta borne donc :)).

Tu peux nous mettre des tests, avec tes résultats ?

regex et les caractères accentués

par BeRoots » 11 déc. 2007, 15:03

Salut à tous :)

je cherche à déterminer la negation de tous les caractères accentués via une regex mais je ne trouve pas de réel classe ou simpification qui m'eviterai d'énumerer tous ces dit caractère. :-k

regarder par exemple cet regex de detection de la validité d'un email:
#^[^-_\.][a-z0-9-_\.]+[^-_\.]@[^-_\.][a-z0-9-_\.]+[^-_\.]\.[a-z]{2,4}$#

si je fait un preg_match via celle-ci sur charéaccentué@pompom.com ou [email protected] par exemple, il me detecte ceci:
charéaccentué@pompom.com ou char[email protected] :?

1°) si quelqu'un peut me dire pourquoi j'ai detection des accentuer et majuscule, alors que j'ai bien spécifié [a-z0-9-_\.] ?

2°) si quelqu'un peut me dire aussi comment faire pour spécifier dans une regex, touts caractères sans les accentués ?

merci d'avance :)