2009-10-13 6 views
0

J'essaie de créer des expressions régulières qui filtreront les courriels valides en utilisant PHP et qui ont rencontré un problème qui est en conflit avec ce que je comprends des expressions régulières. Voici le code que j'utilise.Amusement d'expression régulière avec des courriels;

if (!preg_match('/^[-a-zA-Z0-9_.][email protected][-a-zA-Z0-9]+.[a-zA-Z]{2,4}$/', $string)) { 
return $false; 
} 

maintenant des matériaux que j'ai étudié, cela devrait permettre le contenu avant que le @ pour avoir plusieurs lettres, des chiffres, et souligne les périodes, puis par la suite pour permettre à plusieurs lettres et de chiffres, alors besoin d'une période, puis deux à quatre lettres pour le domaine de premier niveau.

Toutefois, pour l'instant, il ne tient pas compte de la nécessité d'avoir la section de domaine de premier niveau. Par exemple, [email protected] est évidemment valide (et devrait l'être), mais un @ b est également retourné comme valide, ce que je veux marquer comme non.

Je suis sûr que je "suis manque quelque chose, mais après la navigation Google pour une heure, je suis à une perte de ce qu'il pourrait être quelqu'un a une réponse à cette énigme

EDIT:.? La vitesse que les réponses arrivent ici rend ce site supérieur à ses concurrents.Bien fait!

+2

Votre expression régulière ne correspond pas à [email protected] –

+2

Est-il censé correspondre à une adresse e-mail, ce qui signifie qu'il suffit de vérifier si elle est valide? Découvrez la propre méthode filter_var de PHP en utilisant la constante FILTER_VALIDATE_EMAIL. Pourrait faire l'affaire très bien .. –

+0

Ya je pense que je pourrais juste l'utiliser. Cela ne se comporte pas comme on me l'a dit à travers plusieurs sources. – canadiancreed

Répondre

5

Vous devez échapper . quand il est ne fait pas partie du groupe: '/^[-a-zA-Z0-9_.][email protected][-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/' Sinon, il sera égal à une lettre:

  • . - un symbole (mais pas la nouvelle ligne \n sinon en utilisant s modifier)
  • \. - symbole dot
  • [.] - symbole point (groupe de symboles à l'intérieur)
+0

Au lieu de \., Je trouve [.] Être plus lisible. Cela met le. personnage dans son propre groupe. –

+0

D'accord. Bien que cela n'a pas fait la différence. Tous les deux \. et [.] disent toujours que l'email passé est valide. – canadiancreed

+0

Je viens d'exécuter 'var_dump (preg_match ('/^[- a-zA-Z0-9 _.] + @ [-a-zA-Z0-9] + \. [A-zA-Z] {2, 4} $/',' a @ basd ')); 'et il imprime' int (0) 'ce qui est faux –

5

Plutôt que de rouler le vôtre, vous devriez peut-être lire l'article How to Find or Validate an Email Address on Regular-Expressions.info. L'article explique également pourquoi vous ne voulez pas valider une adresse e-mail en utilisant un expression régulière et fournit 3 expressions régulières que vous pourriez envisager d'utiliser à la place des vôtres:

0

un seul point dans un exp régulier ression signifie "correspondre un caractère". Et c'est exactement ce qui se passe lorsqu'un domaine de premier niveau est manquant (même s'il est présent, bien sûr).

Ainsi, vous devriez changer votre code comme ça:

if (!preg_match('/^[-a-zA-Z0-9_.][email protected][-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/', $string)) { 
    return $false; 
} 

Et par ailleurs: a lot more characters are allowed in the local part que ce que l'expression régulière permet actuellement.

+0

D'accord sur votre lien. Je me suis dit que je devrais travailler avant de commencer à m'impliquer davantage et à me mettre en travers de ma tête. A également essayé votre code. Même résultat, il ne nécessite pas de point et valide sans lui. – canadiancreed

+0

Cela fonctionne pour moi. Quelle entrée avez-vous essayé? – innaM

1

Ceci est le commerce le plus raisonnable hors de la spécification par rapport à la vie réelle que je l'ai vu:

[a-z0-9!#$%&'*+/=?^_`{|}~-]+ 
(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)* 
@ 
(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ 
(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b 

Bien sûr, vous devez supprimer les sauts de ligne, et vous devez le mettre à jour si plus top- les domaines de niveau deviennent disponibles.

3

Sur la page Comparing E-mail Address Validating Regular Expressions: Geert De Deckere du projet Kohana a mis au point un presque parfait un:

/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*[email protected](?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD 

Mais il y a aussi une fonction de buildin en PHP filter_var($email, FILTER_VALIDATE_EMAIL) mais il semble être en cours de développement. Et il existe une autre solution sérieuse: PEAR:Validate. Je pense que la solution PEAR est la meilleure.

+0

J'ai rencontré quelques limitations du filtre_Var (tailles de domaine supérieures illimitées pour un), donc je vais donner une chance au PEAR. Merci! – canadiancreed

+0

que sont les "tailles de domaine supérieures illimitées"? J'ai compris qu'un tld peut contenir jusqu'à 5 caractères (.museum) et qu'un domaine peut contenir jusqu'à 63 caractères. – ty812

Questions connexes