Précédent   Forum des professionnels en informatique > PHP > Langage > Regex
Regex Forum d'entraide sur les expressions rationnelles PHP. Avant de poster -> FAQ regex, Cours de regex et Sources de regex
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/02/2006, 12h13   #1
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Par défaut Petite vérification d'expression régulière

Bonjour,

Je viens de trouver cette expression régulière, servant à vérfier la conformité de la forme d'une adresse email :
Code :
preg_match( "/^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]{2,}[.][a-z]{2,4}$/", $_POST["mail"] )
1)Pourriez-vous me confirmer qu'elle est valable.
Par exemple, je viens de constater qu'un email tel que bob@bob..com peut passer, mais je ne crois pas que ce soit un standard valide pourtant.

2) Aussi, si vous pouviez me filer l'expression régulière permettant de vérifier qu'il n'y a que des lettres dans un champs, ce serait sympa .

(Peut être :
Code :
preg_match("/^[a-zA-z],$_POST["mail"])
? )

3) Je voudrais bien comprendre ce que signifie le {2,} et le {2,4} dans l'expression d'en haut.


Merci pour vos lumières.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 12h32   #2
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Je viens d'essayer cela pour vérifier si il n'y a que des lettres :

Code :
if(preg_match( "/^[a-zA-Z]$/", $_POST["identite"] ))
ça ne fonctionne pas.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 12h58   #3
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
je viens d'essayer cela :
Code :
if(preg_match( "/^[:alpha:]+$/", $_POST["identite"] ))
J'obtiens le poème suivant :
Code :
Warning: preg_match(): Compilation failed: POSIX named classes are supported only within a class at offset 1 in /home/site/scripts/dico/envoiMail.php on line 10
Je viens aussi d'essayer cela :
Code :
if(preg_match( "^[:alpha:]+$", $_POST["identite"] ))
Cette fois j'obtiens :
Code :
Warning: preg_match(): No ending delimiter '^' found in /home/site/scripts/dico/envoiMail.php on line 10
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 13h29   #4
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon maintenant je viens d'essayer cela :

Code :
if(preg_match( "/^[A-Za-z]+$/", $_POST["identite"] ))
Cette fois cela fonctionne sauf si il y a des majuscules.




*edit* ça fait un peu de la peine de s'auto répondre.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h11   #5
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Citation:
3) Je voudrais bien comprendre ce que signifie le {2,} et le {2,4} dans l'expression d'en haut.
A moins que je ne dise de betise
{2,} signifie "au moins deux fois"
{2,4} signifie "au moins deux fois, jusqu'à quatre fois"
Ceci s'applique a l'élément précédent.
donc [a-z]{2,} signifie "au moins deux carateres de a à z"

Code :
2) Aussi, si vous pouviez me filer l'expression régulière permettant de vérifier qu'il n'y a que des lettres dans un champs, ce serait sympa
[a-zA-z]
Je pense que sa donne : preg_match("[a-zA-z]",$_POST["mail"])
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h22   #6
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Merci ePox pour ta réponse, je commencais à désespérer.

Cela étant je viens d'essayer, cela, inspiré par ton expression régulière:
Code :
1
2
3
if(preg_match("[a-zA-z]",$_POST["identite"]))
{$avertissement='identite ok';}
else{$avertissement='identite non conforme';}
Pour le test, j'ai écrit test et test test mais ça ne passe pas, j'obtiens "identité non conforme".
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h42   #7
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
y'à quoi dans post["identite"] ?
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h47   #8
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Et bien comme j'ai dit, j'ai écrit test.

je viens d'essayer cela (réessayer?) :
Code :
preg_match( "`^[a-zA-Z]`" ,$_POST["identite"])
J'ai:
Code :
Warning: preg_match(): No ending delimiter '^' found in /home/site/scripts/dico/envoiMail.php on line 10

C'est vraiment pénible de passer 3 heures pour une broutille comme ça...
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 14h53   #9
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Code :
1
2
3
4
5
6
7
<?php
 
if(preg_match("`^[a-zA-z]*$`","zerzerzerezr")){$avertissement='identite ok';} 
else{$avertissement='identite non conforme';} 
 
echo $avertissement;
?>
Celle ci devrait être correct.
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h03   #10
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Oui et non :

Il y a un problème avec les majuscules, selon leur position :
-'Test test' fonctionne bien.
-'test Test' ne fonctionne pas.
Les chiffres sont bien filtrés par contre.

(En plus il faudrait prendre en compte les accents).


Bien sur je peux tout passer par strtolower avant et virer tous les accents. Mais c'est bidon, normalement une bonne régex doit régler tout ça à elle seule.

**edit**
Que signifie ton *$, ePox ?
J'ai essayé avec a-zA-Z aussi, même problème avec les majuscules.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h19   #11
Membre Expert
 
Inscription : juillet 2004
Messages : 1 033
Détails du profil
Informations forums :
Inscription : juillet 2004
Messages : 1 033
Points : 1 050
Points : 1 050
Le étoile c'est pour dire qu'il peut y avoir 0 à n occurences.

Le dollar, c'est poure dire que la chaine doit terminer par tel schéma, c'est le complémentaire du chapeau.

Pour les accents je ne sais pas torp comment faire sans se prendre la tête :s

Mais sa pourrait donner cela :

Code :
1
2
if(preg_match("`^([a-zA-z- -é]*)$`","R dfgéfd gdfgdffc")){$avertissement='identite ok';} 
else{$avertissement='identite non conforme';}
ePoX est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h23   #12
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Non c'est caca, même les chiffres passent.

Bon, je vais essayer le truc pourri qui consiste à virer d'abord les accents et à tout passer en minuscule et après je vous dis si je sais voler.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h29   #13
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Je viens de tester cela :

Code :
1
2
3
4
5
6
7
8
$identite2=strtolower($identite);
 $a = "àáâãäåòóôõöøèéêëçìíîïùúûüÿñ";
 $b = "aaaaaaooooooeeeeciiiiuuuuyn";
$identite2= strtr($identite2, $a, $b);
 
if(preg_match("`^[a-z]*$`",$identite2))
{$avertissement='identite ok';} 
else{$avertissement='identite non conforme';}
cela fonctionne avec TEST et test mais si il y a deux mots, ou plus, cela foire de nouveau.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 15h41   #14
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
C'est réellement insupportable, je viens d'essayer cela :
Code :
preg_match("`[[:alpha:]]`" ,$identite2)
et les chiffres passent encore.........
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 16h18   #15
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Désolé pour le temps de réponse : pour ma part, je n'ai pas le Net en permanence.
Essaie avec ceci :
Code :
1
2
$email = 'bob.a@ta.zs.fr';
echo preg_match('/^[a-z0-9_-]+(\.[a-z0-9_-]+)*+@[a-z0-9-]{2,}\.[a-z]{2,4}$/i', $email);
Cela t'affiche "1" si l'adresse est valable, "0" sinon.
Cela dit, je n'ai pas lu la RFC donc l'expression peut être erronnée...

Si tu ne souhaites pas t'embêter avec les problèmes de casse, utilise le modificateur "i".
Pour vérifier qu'il n'y a que des lettres dans une chaîne, utilise ceci :
Mais cela ne te donnera que les lettres de l'aplhabet anglais... Si tu veux en ajouter, voici la marche à suivre :
Code :
'/^[a-zéèàûüç]$/i
Si tu utilises preg_..., alors tu dois utiliser un délimiteur en début et en fin d'expression. Ce délimiteur peut être n'importe quoi mais tu dois le mettre de chaque côté de ton expression :
Code :
1
2
3
'^[a:alpha:]+$' // incorrect
'/^[a:alpha:]+$/' // correct
'#^[a:alpha:]+$#' // correct
Dans la première expression, PHP considère ton ^ comme un délimiteur (puisque c'est le premier caractère de la chaîne) mais il ne le trouve pas à la fin, d'où l'erreur.
En revanche, je ne peux pas t'aider pour l'utilisation des classes comme :alpha:, je ne les aime pas trop (je les trouve incomplètes). Et il me semble absurde de devoir donner au moins autre chose (ici : "a") pour être en mesure d'utiliser ces classes POSIX...

Je te recommande d'utiliser le modificateur "i" plutôt que de mettre des classes du genre [a-zA-Z] car c'est plus facile à modifier alors que ça revient au même. Cependant, je ne sais pas si ce modificateur fonctionne pour les caracères spéciaux ou accentués...

Les accolades {} servent à définir le nombre de caractères que tu souhaites, un peu comme *, + et ? mais en plus précis :
Code :
1
2
3
4
5
6
7
?       zéro ou une fois
*       de zéro à un nombre infini de fois
+       de une à un nombre infini de fois
{1}     un caractère
{4}     quatre caractères
{1,4}   de un à quatre caractères
{1,}    de un à un bombre infini de caractères
Si je ne me trompe pas, les paires suivantes sont équivalentes :
Code :
1
2
3
?   {0,1}
*   {0,}
+   {1,}
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 17h45   #16
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Merci infiniment pour ta réponse très complète Kirkis.

Cela étant je dois vraiment être con comme un balais, parce que ça ne fonctionne toujours pas.

Je viens d'essayer cela :

Code :
1
2
3
if(preg_match('/^[a:alpha:]+$/' ,$identite))
{$avertissement='identite ok';} 
else{$avertissement='identite non conforme';}
et cela

Code :
1
2
3
if(preg_match("/^[a-z]$/i" ,$identite))
{$avertissement='identite ok';} 
else{$avertissement='identite non conforme';}
Mais si j'entre le mot "test" dans le formulaire, j'obtiens dans les deux cas "identité non conforme"
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 18h03   #17
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Tu dois effectivement être un manche (j/k) car ceci fonctionne :
Code :
1
2
3
4
5
$identite = 'test';
if(preg_match('/^[a-z]+$/' ,$identite))
{$avertissement='identite ok';}
else{$avertissement='identite non conforme';}
echo $avertissement;
Pour la classe POSIX, j'ai averti que je ne suis pas un expert :/
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 18h15   #18
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Bon oui, alors je viens de réessayer :

Cela fonctionne en effet mais pas si il y a deux mots.
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 18h22   #19
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Bah non : l'espace n'est pas une lettre entre a et z...
[Edit] Je crois que je viens de piger les classes POSIX...
Code :
/^[[:alpha:]]+$/   semble équivaloir   /^[a-z]+$/i
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2006, 18h35   #20
Membre éclairé
 
Inscription : juillet 2005
Messages : 1 221
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 1 221
Points : 398
Points : 398
Ok !

Alors je viens de reprendre ta regexp et j'ai rajouté i à la fin, comme suit:

Le i permet donc d'ignorer la casse (je te l'explique pour que tu saches le faire seul une autre fois Kirkis ).


La vache 6 heures pour ça quand même.....
psychoBob est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h54.


 
 
 
 
Partenaires

Hébergement Web