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 07/07/2006, 16h17   #1
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Par défaut Tester un mail

Bonjour,

Je m'initie aux expressions régulières avec Le PDF de Naholyr et je bute déjà sur le premier exemple.

Voici le code retravaillé (une partie en POSIX et l'autre en PCRE)
Le principe est de, d'abord, vérifier que la chaine $adresse est bien un email valide, puis d'extraire cette adresse de la chaine $texte.

Les 2 méthodes utilisent le même pattern à la syntaxe près.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
$adresse = 'm.test@monfai.fr';
$texte = 'Cette chaine : '. $adresse . ' contient un mail';
 
echo '<strong>VERSION POSIX</strong>' . '<br /><br />'; 
if (ereg('^[[:alnum:]_\.]+@[[:alnum:]_\.]+\.[[:alpha:]]+$', $adresse)) 
    echo $adresse . ' est invalide.<br /><br />'; 
else
    echo $adresse . ' est valide.<br /><br />';
if (ereg('([[:alnum:]_\.]+)@([[:alnum:]_\.]+\.[[:alpha:]]+)', $texte, $regs)) 
{
    echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
    echo 'LOGIN : ' . $regs[1] . ' - '; 
    echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
}
else
    echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
print_r($regs);
echo '<br /><br />';
 
 
 
echo '<strong>VERSION PCRE</strong>' . '<br /><br />'; 
if (preg_match('`^[\w\.]+@[\w\.]+\.[a-z]+$`i', $adresse))
    echo $adresse . ' est invalide.<br /><br />';
else
    echo $adresse . ' est valide.<br /><br />';
 
if (preg_match('`([\w\.]+)@([\w\.]+\.[a-z]+)`i', $texte, $regs)) 
{
    echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
    echo 'LOGIN : ' . $regs[1] . ' - '; 
    echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
} 
else
    echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
print_r($regs);
echo '<br /><br />';
Mon problème est le suivant :
- Tel quel, les 2 méthode m'inquent que le mail est invalide mais l'extraient correctement de la chaine $texte
- Si j'ajoute un tiret (-) entre "mon" et "fai", c'est le contraire : le mail serait valide mais impossible de l'extraire.

__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 17h17   #2
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
je sais pas si ca peut t'aider, mais y a la FAQ qui traite ca : http://php.developpez.com/faq/?page=mail#mail_verif

et un conseil, ne travaille qu'en PCRE, donc preg_ parce que c'est beaucoup plus rapide !!
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 17h54   #3
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
J'ai bien l'intention de na travailler qu'avec PCRE mais je voudrais également comprendre POSIX pour le cas où je tomberait sur une RegExp POSIX.
De plus, j'ai du lire quelque part que, pour des requetes simples, il peut être plus simple d'utiliser [:alpha:] plutot que \w qui est plus complète et donc moins précise.

Je lis ton lien...

C'est bête mais j'ai pensé à la FAQ quand j'ai cherché une doc sur les RegExp mais je n'y ai pas pensé pour mon pb
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 18h16   #4
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Bon, déjà il faudrait que je mette les if dans le bon ordre:
C'est à dire que si preg_match retourne vrai c'est que c'est "valide" et non "invalide" comme je l'ai écrit

Ensuite, comment j'ajoute la possibilité du signe "-" dans mes crochets ?
([\w\.]+)@([\w\.]+\.[a-z]+)

comme ça
([\w\.]+)@([\w\.-]+\.[a-z]+)

ou comme ça
([\w\.]+)@([\w\.\-]+\.[a-z]+)

?

Et, après avoir lu le modèle de la FAQ, je vais chercher (tout seul comme un grand ) à voir pour rejeter les adresses commencant par autre chose qu'une lettre comm ".toto@fai.fr"

__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 21h48   #5
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

Juste au cas où le lien serait passé inaperçu malgré sa présence dans la FAQ :
Initiation aux expressions régulières en PHP

Étant donné que la norme POSIX est moins complète que les PCRE, tu peux apprendre uniquement ces dernières.

Maxoo : ce n'est pas toujours plus rapide, malheureusement.
Fais un test sur des regexes simples, tu verras
__________________
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 07/07/2006, 22h06   #6
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Citation:
Envoyé par Yogui
Maxoo : ce n'est pas toujours plus rapide, malheureusement.
Fais un test sur des regexes simples, tu verras
http://www.expreg.com/pcreplus.php

ce n'est qu'un exemple mais j'ai toujours vu les sites dire que c'était plus rapide, et je l'ai testé moi même, y a même des sites qui chronomètre le temps d'éxecution je crois.

Enfin bref, moi j'ai toujours vu que c'était plus rapide...
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/07/2006, 22h58   #7
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
C'est aussi ce que j'ai toujours lu mais, en écrivant le tuto, j'ai fait qqes tests et ça n'a pas confirmé...
Certaines regex simples inversent la tendance. Si j'ai le temps un jour, je te donnerai un exemple.
[/HS]
__________________
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 08/07/2006, 13h46   #8
Expert Confirmé
 
Avatar de Maxoo
 
Maxime Pasquier
Expert PHP
Inscription : novembre 2004
Messages : 2 126
Détails du profil
Informations personnelles :
Nom : Maxime Pasquier
Âge : 28
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Expert PHP
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : novembre 2004
Messages : 2 126
Points : 2 602
Points : 2 602
Citation:
Envoyé par Yogui
C'est aussi ce que j'ai toujours lu mais, en écrivant le tuto, j'ai fait qqes tests et ça n'a pas confirmé...
Certaines regex simples inversent la tendance. Si j'ai le temps un jour, je te donnerai un exemple.
[/HS]
(meme si c'est HS, c'est intéressant)
Oki, d'un autre coté, c'est plus sur les regex compliqué que l'on veut connaitre la rapidité, sachant que sur une regex simple, ca ira vite de toute façon
__________________
Pour une bien meilleur lisibilité, utilisez la balise [code], c'est le [#] dans votre éditeur.
Mon espace Développez : mes Créations.


Rencontre & Carte des Membres de Developpez.com, version 3.0
Maxoo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/07/2006, 21h44   #9
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Désolé pour le délai mais j'ai pas recu la notification (ou alors elle est partie dans le spam Faut que je vérifie)

Voici la dernière version (n'oublions pas que le but n'est pas de créer une fonction de test d'adresse mail mais de comprendre les RegExp)
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$adresse = 'm.test@mon-fai.fr';
$texte = 'Cette chaine : '. $adresse . ' contient un mail';
 
echo '<strong>VERSION PCRE</strong>' . '<br /><br />'; 
if (preg_match('`^[\w][\w\.-]+@[\w\.-]+\.[a-z]{2,4}$`i', $adresse))
    echo $adresse . ' est valide.<br /><br />';
else
    echo $adresse . ' est invalide.<br /><br />';
 
if (preg_match('`\s([\w][\w\.-]+)@([\w\.-]+\.[a-z]{2,4})\s`i', $texte, $regs)) 
{
    echo 'On a trouvé l\'adresse ' . $regs[0] . ' dans "' . $texte . '"<br />'; 
    echo 'LOGIN : ' . $regs[1] . ' - '; 
    echo 'DOMAINE : ' . $regs[2] . '<br /><br />'; 
} 
else
    echo 'aucune adresse e-mail dans cette chaîne.<br /><br />';
print_r($regs);
echo '<br /><br />';
Ainsi "m.test@monfai.fr" et "m-test@mon-fai.fr" passent bien tandis que
".m.test@monfai.fr" est bloquée (le point au début)

Vous remarquerez pour pour retrouver l'adresse mail dans la phrase, j'ai du ajouter "\s" au début et à la fin. Sinon, l'adresse ".m.test@monfai.fr" était bien trouvé puisque le point de départ était considérée "hors pattern".

J'ai également limité la longueur du domaine ( "{2,4}" ) car si la phrase était "Cette chaine : m.test@mon-fai.frcontient un mail" (remarquez l'espace oublié entre le fr et le mot suivant), le test trouvait l'adresse "m.test@mon-fai.frcontient"

Mais je ne sais toujours pas si' j'ai saisi correctement mes "tirets (-)" dans les plages de valeurs ou s'il faut plutot les écrire "[\w\.\-]" ?

Citation:
Envoyé par Yogui
Juste au cas où le lien serait passé inaperçu malgré sa présence dans la FAQ
En fait j'ai fait mes recherches de tuto sur Google et je suis passé à coté
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h21.


 
 
 
 
Partenaires

Hébergement Web