Expression régulières PHP

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

6 réponses

  1. avec ceci tu as tu code compact et lisible:
    "/\b[a-z0-9_\-\.]+[@][a-z0-9_\-\.]+\.[a-z]{2,}\b/i"
    1. merci je veux essayer :)
  2. 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
    1. 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
      1. ton code est erroné car il peut egalement fonctioner pour:

        aaaaa@bbbbb

        or tu as besoin de

        aaaaa@bbbb.ccc
      2. j'aurais même dit:

        Tu as besoin de a.b1_c-2@de_3f-4.ghi5
      3. oui son code ne prend pas en compte les domaines ou suffix
      4. 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
      5. 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]);
    2. 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!
      1. 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
        1. Oui Laorra c'est moi qui me suis trompé.
          Je corrige ça tout de suite ;)
        2. Trop d'honneur :)
      2. 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]);     
         
        1. if($isOK === 1)
        2. Akronos : Pas forcément ! Car tu exclus d'office les cas où il y a plusieurs adresses de courriel dans la chaîne...
        3. 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)
        4. oui c vrai :)
        5. 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 :)