2009-09-03 8 views
15

Possible en double:
How can I convert ereg expressions to preg in PHP?Comment changer la eregi de PHP preg_match

je besoin d'aide, ci-dessous est un petit regex très basique pour valider un peu un e-mail, je me rends bien compte qu'il fait pas travailler le meilleur mais pour mes besoins c'est ok pour le moment.

Il utilise actuellement la fonction de eregi de PHP qui dit php.net est maintenant une fonction dépréciée et je devrais utiliser preg_match à la place, le simple remplacement erei avec preg_match ne fonctionne pas, quelqu'un peut me montrer comment le faire fonctionner?

function validate_email($email) { 
    if (!eregi("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
function validate_email($email) { 
    if (!preg_match("^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 
+0

Notez que vous ne devriez pas utiliser cette expression régulière pour valider le courrier électronique; il est sévèrement dépassé. – Piskvor

+0

@Piskvor Je suis d'accord, cette question a presque 5 ans aussi =) vous devriez poster une réponse mise à jour si vous aimez et je peux toujours changer la réponse "sélectionnée" à la meilleure approche – JasonDavis

+0

C'est IMHO en dehors de la portée de la ereg/question de preg; commenter me semble suffisant. – Piskvor

Répondre

25

Les motifs regex de style Perl doivent toujours être délimités. Le premier caractère de la chaîne est considéré comme le séparateur, donc quelque chose comme ceci:

function validate_email($email) { 
    if (!preg_match("/^[[:alnum:]][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i", $email)) { 
     echo 'bad email'; 
    } else { 
     echo 'good email'; 
    } 
} 

La raison pour laquelle votre première tentative ne fonctionne pas est parce qu'il essayait d'utiliser ^ comme délimiteur, mais (évidemment) trouvé aucune correspondance ^ pour la fin de l'expression régulière.

+0

Merci, je viens de trouver FILTER_VALIDATE_EMAIL de php, il semble que ce soit le meilleur moyen d'y aller mais je ne trouve pas beaucoup d'informations à ce sujet – JasonDavis

+2

@jasondavis, 'FILTER_VALIDATE_EMAIL' serait certainement un meilleur choix. Les e-mails sont ** compliqués **. – TRiG

10

Vous devrez changer trois choses

  1. besoin d'ajouter délimiteurs motif (peut être un caractère, mais le plus souvent une barre oblique)
  2. [[: alnum:]] devront être remplacés avec l'équivalent PCRE
  3. Le "i" dans "eregi" signifie insensible à la casse, ce que fait PCRE avec un drapeau, plus précisément l'indicateur i.

Sinon, le reste semble PCRE compatible (oui, c'est un peu redondant = P)

"/^[a-z0-9][a-z0-9_.-]*@[a-z0-9.-]+\.[a-z]{2,4}$/i" 
+1

Le PCRE de PHP inclut des options comme [: alnum:] en tant qu'options. – Amber