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. 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
    1. if($isOK === 1)
      0
    2. Akronos : Pas forcément ! Car tu exclus d'office les cas où il y a plusieurs adresses de courriel dans la chaîne...
      0
    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)
      0
    4. oui c vrai :)
      0
    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 :)
      0
  2. 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
    1. Oui Laorra c'est moi qui me suis trompé.
      Je corrige ça tout de suite ;)
      0
    2. Trop d'honneur :)
      0
  3. 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
    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
      0
      1. ton code est erroné car il peut egalement fonctioner pour:

        aaaaa@bbbbb

        or tu as besoin de

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

        Tu as besoin de a.b1_c-2@de_3f-4.ghi5
        0
      3. oui son code ne prend pas en compte les domaines ou suffix
        0
      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
        0
      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]);
        0
    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
      0
      1. avec ceci tu as tu code compact et lisible:
        "/\b[a-z0-9_\-\.]+[@][a-z0-9_\-\.]+\.[a-z]{2,}\b/i"
        0
        1. +1
          0
        2. merci je veux essayer :)
          0