2012-04-13 7 views
0

Ich weiß, dass es mehrere E-Mail-Regexs auf SO gibt, aber ich konnte nichts finden, was meinem Fall entspricht.E-Mail-Adresse tld regex

haben wir ein E-Mail-System, das mit dieser Regex versagt:

if (!ereg("^\[?[0-9\.]+\]?$", $email_array[1])) { 
     $domain_array = explode(".", $email_array[1]); 
     if (sizeof($domain_array) < 2) { 
      $this->result = 0; 
     } 
     for ($i = 0; $i < sizeof($domain_array); $i++) { 
      if 
(!ereg("^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$", 
    $domain_array[$i])) { 
      $this->result = 0; 
      } 
     } 
     } 

versuchen, an einer E-Mail-Adresse im Format per E-Mail:

[email protected] 

Ich gehe davon aus, es ist die zusätzliche .value. Das verursacht das Problem und ich bin nicht sehr erfahren mit Regex, um dies zu beheben. Kann jemand helfen?

die Regex ..

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$ 

Dank im Voraus.

+3

Bitte zu sehen seine http://stackoverflow.com/questions/201323/how-to-use-a-regular-expression-to- Validiere eine Email Adresse. Verwenden Sie keine Regex, um eine E-Mail-Adresse zu validieren. –

+0

es ist für eine Reparatur für ein Live-System erforderlich, haben Sie nicht die Möglichkeit, zu viel in diesem Stadium zu ändern. – ChelseaStats

+0

ereg ist veraltet: http: // php.net/manual/de/function.ereg.php – Toto

Antwort

1

Die Regex:

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|?([A-Za-z0-9]+))$ 

sollte einzelne Teile eines Domain-Namen übereinstimmen. Recht?

Also, wenn Sie some-text.value.subdomain.domain.co.uk als Domain-Namen haben.

Ihr Code teilt sich nach dem Punkt auf und versucht, die einzelnen Unterabschnitte abzugleichen.

So zum Beispiel Some-Text oder Subdomäne.

Dies würde mit dem obigen Regex gut funktionieren; nur die ? nach | ist für die Regex-Engine ablenkend.

würde ich

^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|([A-Za-z0-9]+))$ 

stattdessen versuchen.

Obwohl es immer noch keine gute Regex ist, um einzelne Teile eines Domain-Namen zu entsprechen. Aber ich denke, dass Sie so wenig wie möglich in der Codebasis ändern möchten.

Ein besser man sollte nur der letzte Teil des Wechsels

^[A-Za-z0-9-]+$ 
1

Wenn Sie E-Mail-Validierung betrachten, sollten Sie auf die filter_var() Funktion zurückgreifen, die besser funktioniert als ein Regex imho.

filter_var('[email protected]', FILTER_VALIDATE_EMAIL); 
+1

Wenn Sie die Quelle cold von 'filter_var()' betrachten, würden Sie sehen, dass seine Validierung auf Regex basiert –

+0

Natürlich, aber das schlägt immer noch Ihre eigene Regex im Code schreiben – ChrisR

+0

Ja, aber diese Funktion funktioniert nicht besser als ein Regex "becuase ** es ist ** ein Regex. Es verwendet einen Regex, der besser funktioniert als ** OPs ** Regex. –

1

Oder Sie können diesen regex verwenden:

^([0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$ 

Es entspricht Ihre angegebene E-Mail und funktioniert mit den meisten von ihnen (99,99% oder so)

Verwandte Themen