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 25/05/2007, 17h20   #1
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Par défaut Extraction chaine ou debut d'adresse mail

Bonjour,
Alors voila la chaine:
Soit:
benjy cerede2000@toto.fr
Soit:
cerede2000@toto.fr
Dans le premier cas je veut récupérer "benjy", dans le deuxième "cerede2000".
Voici la regex que j'ai fait pour le moment mais evidemment elle ne me donne pas ce que je veut pas loin quand même
Code :
'`^(\b[0-9a-zA-Z\.\-_ ]*\b)|(\w(?:[-_.]?\w)*@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4}))$`', 'benjy cerede2000@toto.fr'
Merci
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2007, 19h37   #2
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Avec ceci:
Code :
1
2
 
preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
Pour $mail = 'benjy cerede2000@toto.fr';
print_r me donne:
Code :
1
2
 
Array ( [0] => benjy cerede2000@toto.fr [1] => benjy [2] => cerede2000 )
Pour $mail = 'cerede2000@toto.fr';
print_r me donne:
Code :
1
2
 
Array ( [0] => cerede2000@toto.fr [1] => [2] => cerede2000 )
Y a t'il un moyen d'eviter d'avoir une case du tableau vide?
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/05/2007, 23h36   #3
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
peut-être en t'aidant de strrpos($mail,' ') pour trouver le dernier espace.

une suggestion de regex si j'ai bien compris le but.

Code :
1
2
 
preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(?:\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`', $mail, $out);
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 00h18   #4
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Eu non ta REGEX n'est pas bonne et puis c'est quoi le ?!@
J'ai reussi pour ma REGEX mon seul probleme c'est la case vide du tableau, j'aurai aimé ne plus l'avoir mais bon...
Je fait avec
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 01h23   #5
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
Citation:
Envoyé par cerede2000
Eu non ta REGEX n'est pas bonne
alors je n'ai pas compris ton but. je croyais que les cas suivant

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
$mails[]='cerede2000@toto.fr';
$mails[]='banjy cerede2000@toto.fr';
$mails[]='banjo banjy cerede2000@toto.fr';
 
echo '<pre>';
 
foreach($mails as $mail) {
  if(preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(?:\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`',$mail,$out)) {
    print_r($out);
  }
}
 
echo '</pre>';
devait produire

Citation:
Array
(
[0] => cerede2000@toto.fr
[1] => cerede2000
)
Array
(
[0] => banjy cerede2000@toto.fr
[1] => banjy
)
Array
(
[0] => banjo banjy cerede2000@toto.fr
[1] => banjo banjy
)
Citation:
Envoyé par cerede2000
et puis c'est quoi le ?!@
une négation pour ne pas valider un cas comme
banjy @toto.fr
une assertion négative ne déplace pas le curseur sur la chaine source, contrairement à une classe [^@] qui elle fera le déplacement.

Citation:
Envoyé par cerede2000
J'ai reussi pour ma REGEX mon seul probleme c'est la case vide du tableau,
toutes les captures dans une regex produisent obligatoirement un résultat, vide s'il n'y avait pas de concordance. la seule manière est de réécrire la regex pour faire 1 seule capture d'où ma suggestion.
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/05/2007, 10h57   #6
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Ah effectivement c'est ce que je voulais j'avais pas fais assez attention méa culpa.
Merci a toi daniel61
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 00h01   #7
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Non c'est bien ce qu'il me semblait ta REGEX ne fonctionne pas comme je le voulais...
Si on a
$mail = 'benjy cerede2000@toto.fr';
Je doit recupere benjy et cerede2000@toto.fr
Et si on a
$mail = 'cerede2000@toto.fr';
Je doit recupere cerede2000 et cerede2000@toto.fr
Donc pour le moment il y a juste ca qui me donne satisfaction:
Code :
preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
Mais j'ai le probleme de la case vide dans le cas de ca:
$mail = 'cerede2000@toto.fr';
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 04h45   #8
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
Citation:
Envoyé par cerede2000
Si on a
$mail = 'benjy cerede2000@toto.fr';
Je doit recupere benjy et cerede2000@toto.fr
les captures semblent être sur benjy et cerede2000... @toto.fr est à oublier?

Citation:
Envoyé par cerede2000
Donc pour le moment il y a juste ca qui me donne satisfaction:
Code :
preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out);
Mais j'ai le probleme de la case vide dans le cas de ca:
$mail = 'cerede2000@toto.fr';
Code :
1
2
 
    if(empty($out[1])) {array_splice($out,1,1);}
sinon, preg_split() peut détruire les éléments vides.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
$mails[]='cerede2000@toto.fr';
$mails[]='benjy cerede2000@toto.fr';
$mails[]='bbbbb benjy cerede2000@toto.fr';
$mails[]='pas bon';
 
$options=PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE;
 
echo '<pre>';
 
foreach($mails as $mail) {
  $out=preg_split('`^((\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4}))$`',$mail,-1,$options);
  if(count($out)>1) { // email pas valide si 1 seul élément
    print_r($out);
  }
}
 
echo '</pre>';
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 15h07   #9
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
bon, je viens d'apprendre quelque chose si la dernière capture est en répétition ? et que cette capture est vide alors preg_match ne génère pas de résultat pour cette capture.

exemples simplifiés:

Code :
1
2
3
4
5
6
7
8
9
10
 
echo '<pre>';
 
preg_match('#^(\w+ |\w+)(\w+)?@\w+\.\w+$#','b@c.d',$ref);
print_r($ref);
 
preg_match('#^(\w+ |\w+)(\w+)?@\w+\.\w+$#','a b@c.d',$ref);
print_r($ref);
 
echo '</pre>';
produira

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Array
(
    [0] => b@c.d
    [1] => b
)
Array
(
    [0] => a b@c.d
    [1] => a 
    [2] => b
)
avec tes motifs:

Code :
1
2
 
preg_match('`^(\w(?:[-_. ]?\w)* (?!@)|\w(?:[-_.]?\w)*)(\w(?:[-_.]?\w)*)?@\w(?:[-_.]?\w)*\.[a-z]{2,4}$`', $mail, $out)
produira

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Array
(
    [0] => cerede2000@toto.fr
    [1] => cerede2000
)
Array
(
    [0] => benjy cerede2000@toto.fr
    [1] => benjy 
    [2] => cerede2000
)
Array
(
    [0] => bbbbb benjy cerede2000@toto.fr
    [1] => bbbbb benjy 
    [2] => cerede2000
)
par contre, il serait peut-être bon de vérifier si c'est le comportement voulu avant utilisation... pour éviter un changement de comportement après correction d'un bug dans une version future de php et/ou pcre. à toi de voir.
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 15h34   #10
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Eu sur les deux réponses j'ai rien comprit
cerede2000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 22h10   #11
Membre habitué
 
Avatar de daniel61
 
Inscription : décembre 2006
Messages : 109
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 109
Points : 120
Points : 120
désolé... il y a 3 suggestions en fait. la première:
if(empty($out[1])) {array_splice($out,1,1);}

empty() permet d'évaluer si le contenu d'une variable est vide ou non, empty($out[1]) retournera true si $out[1] est vide... le cas de ton preg_match sur $mail = 'cerede2000@toto.fr';

array_splice() permet en autre de détruire un ou plusieurs éléments dans un array.

le premier paramètre est le array sur lequel il faut travailler, dans ton cas $out.

le second paramètre est l'indice de ce array ou il faut débuter. dans ton cas c'est 1 pour $out[1].

le dernier paramètre est le nombre d'éléments à enlever. 1 seul élément est à enveler dans le cas de ton preg_match sur $mail = 'cerede2000@toto.fr';

par exemple:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
$mails[]='cerede2000@toto.fr';
$mails[]='benjy cerede2000@toto.fr';
 
echo '<pre>';
 
foreach($mails as $mail) {
  if(preg_match('`^(\w(?:[-_. ]?\w)* )?(\w(?:[-_.]?\w)*)@\w(?:[-_.]?\w)*\.(?:[a-z]{2,4})$`', $mail, $out)) {
    if(empty($out[1])) {array_splice($out,1,1);}
    print_r($out);
  }
}
 
echo '</pre>';
produira:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Array
(
    [0] => cerede2000@toto.fr
    [1] => cerede2000
)
Array
(
    [0] => benjy cerede2000@toto.fr
    [1] => benjy 
    [2] => cerede2000
)
ce qui enleve le vide que tu ne voulais pas dans le cas de $mail = 'cerede2000@toto.fr';
daniel61 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/05/2007, 22h40   #12
Membre expérimenté
 
Étudiant
Inscription : juillet 2004
Messages : 777
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juillet 2004
Messages : 777
Points : 527
Points : 527
Oui ca enleve le vide, mais ca ne recupere plus l'adresse mail toute seule.
Hors j'en ai aussi besoin
Et j'ai deja une méthode pour traiter la case vide, donc ca ou array_slice...
Si on ne peut pas le faire a partir de la REGEX alors tant pit
cerede2000 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 03h58.


 
 
 
 
Partenaires

Hébergement Web