Expression régulières PHP

Fermé
atout1 Messages postés 216 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 juin 2011 - 13 janv. 2011 à 15:14
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 - 13 janv. 2011 à 21:19
Bonjour, tout le monde

j'ai une chaine de caractère :
$chaine = "bla bla bla mail@hotmail.fr bla totot toto ";
j'ai appliquer l'expression suivnat :

echo $mail = preg_match("#[a-zA-z0-9]+[-_.]?[a-zA-Z0-9.-_]+[@][a-zA-z0-9]+[-_.]?[a-zA-Z0-9]+[-_.]+[a-zA-Z0-9]+#", "$chaine" )

le echo me donne 1 , quelqu'un sait commen t faire pour récupere la valeur de mail (mail@hotmail.com)?? Merci d'avance



A voir également:

6 réponses

xamurai Messages postés 223 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 19 février 2013 15
Modifié par xamurai le 13/01/2011 à 16:05
le 1 signifie que c'est une reponse boolean:
corrige ton code comme ceci

$isOK = preg_match("/\b[a-z0-9_\-\.]+[@][a-z0-9_\-\.]+\.[a-z]{2,}\b/i", $chaine, $reponse );     

if($isOK > 0)  
print_r($reponse[0]);     
 
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
13 janv. 2011 à 16:13
if($isOK === 1)
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
13 janv. 2011 à 16:21
Akronos : Pas forcément ! Car tu exclus d'office les cas où il y a plusieurs adresses de courriel dans la chaîne...
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
Modifié par Akronos le 13/01/2011 à 16:30
Oui c'est vrai, mais je me base sur le cas étudié et n'utilise pas des données non précisées. (C'est comme ça qu'on t'apprends à réfléchir).
C'est bête, mais si un client te demande un design bleu, pourquoi rajouté la possibilité de choisir un design vert?
Le but est de répondre à la demande.
En gros, faut répondre à une question par la ou les réponses, et pas prévoir d'autre cas. Mais c'est vrai que dans le cas ou il y a plusieurs adresses mails, il faut utiliser:
if($isOK > 0)

Cependant, s'il n'y en a qu'une, il sera plus efficace et approprié d'utiliser:
if($isOK === 1)
0
xamurai Messages postés 223 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 19 février 2013 15
13 janv. 2011 à 16:32
oui c vrai :)
0
Reivax962 Messages postés 3672 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
13 janv. 2011 à 21:19
En l'occurrence, le client n'a dit ni bleu ni vert.
Le client n'a pas dit ce que contenait « bla bla », et en toute logique, puisqu'on en est à répondre à un client, il aurait fallu poser la question avant d'essayer de répondre ;)

Donc tu réponds peut-être à la demande, mais peut-être pas :)
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
Modifié par Akronos le 13/01/2011 à 16:38
preg_match renvoie un entier (corrigé "par" Laorra).

En fait avec un preg_match tu vérifie une correspondance entre un pattern et une chaine de caractère.

S'il renvoie un c'est qu'il y a une correspondance du pattern dans la chaîne de caractères (c'est surtout utiliser dans les if).

Si tu veux remplacer tu peux utiliser preg_replace.
Il suffit de trouver le bon pattern.
Si tu veux récupérer l'email utilise preg_replace ou ereg.

Tu devrais avoir quelque chose comme:

$pattern = '/^[:alnum:]+[@][:alnum:]+$/';   
$mail = ereg($pattern,$chaine);   


Plus d'infos sur les pattern:
https://www.commentcamarche.net/contents/803-php-expressions-regulieres
0
Laorra Messages postés 195 Date d'inscription dimanche 12 novembre 2006 Statut Membre Dernière intervention 18 juillet 2011 107
13 janv. 2011 à 16:30
Non, je confirme, preg_match renvoi bien un INT (nombre de fois que le chaîne est trouvée)

https://www.php.net/manual/fr/function.preg-match.php
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
13 janv. 2011 à 16:36
Oui Laorra c'est moi qui me suis trompé.
Je corrige ça tout de suite ;)
0
Laorra Messages postés 195 Date d'inscription dimanche 12 novembre 2006 Statut Membre Dernière intervention 18 juillet 2011 107
13 janv. 2011 à 16:42
Trop d'honneur :)
0
Laorra Messages postés 195 Date d'inscription dimanche 12 novembre 2006 Statut Membre Dernière intervention 18 juillet 2011 107
13 janv. 2011 à 15:36
Salut,
Ici la valeur de mail n'est pas "mail@hotmail.com" mais bien 1,, puisque la fonction preg_match cherche si ta chaine passer en second paramêtre, correspond à l'expression régulière en paramêtre 1. Le 1 signifie que oui, cette expression correspond bien.

Le retour de la fonction preg_match est un INT, donc il t'affiche un INT.

Si tu veux afficher l'adresse email, c'est un :

echo $chaine;

que tu dois faire!
0
atout1 Messages postés 216 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 juin 2011
13 janv. 2011 à 15:47
Problème résolu , voilà le code final :

<?php
$chaine = "bla bla bla mail@hotmail.fr bla totot toto ";
preg_match('#[a-zA-z0-9]*[-_.+/\]?[a-zA-Z0-9.-_]+[@][a-zA-z0-9]*[-_.+/\]?[a-zA-Z0-9.-_]+#', $chaine, $matches, PREG_OFFSET_CAPTURE);
$result = array_merge($matches, $matches[0]);
echo $result[1]; // affiche : mail@hotmail.fr
?>

Merci pour vous tous
0
xamurai Messages postés 223 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 19 février 2013 15
13 janv. 2011 à 16:06
ton code est erroné car il peut egalement fonctioner pour:

aaaaa@bbbbb

or tu as besoin de

aaaaa@bbbb.ccc
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
Modifié par Akronos le 13/01/2011 à 16:09
j'aurais même dit:

Tu as besoin de a.b1_c-2@de_3f-4.ghi5
0
xamurai Messages postés 223 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 19 février 2013 15
13 janv. 2011 à 16:09
oui son code ne prend pas en compte les domaines ou suffix
0
atout1 Messages postés 216 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 juin 2011
13 janv. 2011 à 17:11
j'ai essayé plein des choses mais je n'arrive pas prendre en compte que à la fin c'est obligatoire qu'il y aura .blabla

quelqu'un a une idée ? Merci d'avance
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
13 janv. 2011 à 17:16
As-tu essayé le code xamurai?

$isOK = preg_match("/\b[a-z0-9_\-\.]+[@][a-z0-9_\-\.]+\.[a-z]{2,}\b/i", $chaine, $reponse );     

if($isOK === 1)  
print_r($reponse[0]);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
13 janv. 2011 à 15:49
Il veut isoler l'adresse mail du reste de la chaine si j'ai bien compris pour être général, il a:
$chaine = "du texte exemple adresse@domaine.tld encore du texte exemple"
Et il veut:

$mail = adresse@domaine.tld // figurant dans $chaine
0
xamurai Messages postés 223 Date d'inscription mardi 11 janvier 2011 Statut Membre Dernière intervention 19 février 2013 15
Modifié par xamurai le 13/01/2011 à 16:01
avec ceci tu as tu code compact et lisible:
"/\b[a-z0-9_\-\.]+[@][a-z0-9_\-\.]+\.[a-z]{2,}\b/i"
0
Akronos Messages postés 140 Date d'inscription jeudi 6 janvier 2011 Statut Membre Dernière intervention 31 janvier 2011 32
13 janv. 2011 à 16:03
+1
0
atout1 Messages postés 216 Date d'inscription mardi 11 mai 2010 Statut Membre Dernière intervention 17 juin 2011
13 janv. 2011 à 16:22
merci je veux essayer :)
0