2009-09-22 7 views
2

Глядя на сообщения здесь для проверки адреса электронной почты, я ищу, чтобы быть более либеральным в отношении теста на стороне клиента, который я выполняю.Проверка адреса электронной почты, опять

Ближайший я видел до сих пор:

^([\w-\.]+)@((\[[0–9]{1,3}\.[0–9]{1,3}\.[0–9]{1,3}\.)|(([\w-]+\.)+)) 
([a-zA-Z]{2,4}|[0–9]{1,3})(\]?)$

Это не будет соответствовать this#[email protected], которые в соответствии с RFC действует

  • Прописные и строчные английские буквы (az, AZ)
  • цифры с 0 по 9
  • Персонажи! # $% & '* + -/=?^_ `{| } ~
  • Характер. (точка, период, полная остановка) при условии, что он не является первым или последним символом, и также предусматривает, что он не появляется два или более раз подряд.

Я хочу довольно простой матч:

  • не начинается с.
  • Любой символ разрешено до @
  • Любой символ допускается после @
  • Нет подряд. или @ allowed
  • Часть после последнего. (tld) должен быть [a-z0-9-]

Я буду использовать \ i, чтобы сделать регистр поиска нечувствительным. Последовательные символы - это то место, где я повесил трубку.

+0

Я работаю на одном, похоже, что это собирается покрыть ее широко + @. (?:. [- а-z0-9] + \) + [AZ] {2,10} Я не думаю, что будет tld длиной более 10 символов. Музей кажется настоящим держателем записи в странности. – user170579

+0

http://stackoverflow.com/questions/3232/how-far-should-one-take-e-mail-address-validation/300862#300862 – some

+0

Возможный дубликат [Как проверить адрес электронной почты в PHP] (http : //stackoverflow.com/questions/12026842/how-to-validate-an-email-address-in-php) (см. шаблон регулярного выражения) – PeeHaa

ответ

1
/^[^.].*@(?:[-a-z0-9]+\.)+[-a-z0-9]+$/ 
+1

Кажется почти идеальным, одним исключением:

[email protected] [email protected] [email protected] [email protected] t#[email protected] t#[email protected]#mple.com <-this matches t#[email protected]#mple.c#om
Все, что после last @ должен быть только [a-z0-9-] (действительные символы домена), затем точка, затем другая [a-z0-9-] – user170579

+0

Не знаю, как переформатировать этот комментарий, извините за это. – user170579

+0

В вашем вопросе вы сказали, что только имя TLD должно быть [-a-z0-9]. Фиксирование это тривиально. –

4

Если вы хотите, чтобы соответствовать против официального стандарта, you can use

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\]) 

Таким образом, даже когда после официальных стандартов, все еще существуют компромиссы должны быть сделаны. Не слепо копировать регулярные выражения из онлайновых библиотек или дискуссионных форумов. Всегда проверяйте их на своих собственных данных и своими приложениями.

0
function validator(email) { 
    var bademail = false; 
    bademail = (email.indexOf(".") == 0) ? true : bademail; 
    bademail = (email.indexOf("..") != -1) ? true : bademail; 
    bademail = (email.indexOf("@@") != -1) ? true : bademail; 
    if(!bademail) { 
     var tldTest = new RegExp("[a-z0-9-]"); 
     var lastperiodpos = email.lastIndexOf("."); 
     var tldstr = email.slice(lastperiodpos + 1); 
     bademail = (!(tldTest.test(tldstr))) ? true : bademail; 
    } 
    return bademail; 
} 
+1

+1 потому что какой-то хам дал вам -1, не оставив комментария. Я ненавижу это! – TrueWill

+0

Спасибо. Я просто подумал, что на самом деле я просто прошу, как просили, а не включать регулярное выражение, где это не нужно. Хотел бы я подумать о том, как использовать его в конце, который не был запутан. – Anthony

+0

-1. Я не думаю, что «..» обычно является незаконным в адресе электронной почты. Один мой друг однажды получил такой адрес электронной почты. Вы должны просто удалить это правило. А как насчет специальных символов в домене? Они также разрешены, но должны быть переведены в соответствии с [RFC 3492] (http://tools.ietf.org/html/rfc3492). Так что это не правильный ответ. – pvorb

0

Это зависит от того, кто использует приложения. Для внутренних приложений часто имя пользователя является допустимым адресом электронной почты. Большая часть спецификаций электронной почты RFC-822 описывает дополнительные поля, которые могут присутствовать в адресе электронной почты. Например, Allen Town - довольно стандартный адрес электронной почты, который вы можете ввести в свой любимый почтовый клиент. Однако для приложения вы можете захотеть указать имя на адрес электронной почты при отправке электронной почты и не хотите, чтобы это было частью адреса пользователей.

Самый либеральный способ проверки адреса электронной почты - просто попытаться отправить электронное письмо на любой адрес, который пользователь дает. Если они получат электронное письмо и могут подтвердить его, то это действительный адрес.

+0

Я понимаю это, но мне хотелось бы, чтобы некоторые были проверены на передний план. Просто пользователи aol не могут ошибаться :) Не будет локальной доставки, поэтому адрес электронной почты должен быть в формате [email protected] – user170579

-1

Совершенной проверка регулярного выражение, вероятно, трудно соответствовать, но я использовал этот в течение некоторого времени:

/^([\w-\.\+])+\@([\w-]+\.)+([\w]{2,6})+$/ 

только изменил его недавно, чтобы соответствовать 6-обугленной ДВОЙ.

+0

Как насчет 7-x char TLD или цитируемых строк? – PeeHaa

0

Очень Perl-иш RFC822 совместимых регулярных выражений можно найти here

0

Следующая было полезно для меня довольно-то теперь.

function validateEmail(email) { 
    var re = /^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; 
    return re.test(email); 
} 
Смежные вопросы