Ответ 1
Мой снимок (см. комментарий и ссылку выше):
^[email protected]+$
Я ищу регулярное выражение для проверки электронной почты, чтобы узнать, действительно ли оно или нет. У меня есть следующее:
def is_a_valid_email?(email)
email_regex = %r{
^ # Start of string
[0-9a-z] # First character
[0-9a-z.+]+ # Middle characters
[0-9a-z] # Last character
@ # Separating @ character
[0-9a-z] # Domain name begin
[0-9a-z.-]+ # Domain name middle
[0-9a-z] # Domain name end
$ # End of string
}xi # Case insensitive
(email =~ email_regex)
end
Проблема с приведенным выше значением [email protected]
не возвращается как действительная, когда она должна быть. Любые мысли или предложения для лучшего регулярного выражения?
Спасибо
Мой снимок (см. комментарий и ссылку выше):
^[email protected]+$
validates_format_of :email,
:with => /^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9][email protected]((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i
Не просите меня объяснить это! Это было из плагина проверки, который я с тех пор потерял, поскольку все, что мне нужно, - это регулярное выражение электронной почты.
Ответ @jensgram действительно хорош, но на самом деле он по-прежнему позволяет отправлять электронную почту без домена, например. foo @bar действует так же, как [email protected]
Здесь небольшая вариация, требующая [email protected]:
/\A\[email protected]+\.\S+\z/
или, более читаемый (хотя скобки не нужны):
/\A(\S+)@(.+)\.(\S+)\z/
* Примечание: это регулярное выражение лучше многих, более сложных, из-за того, насколько невероятно разнообразным может быть электронное письмо. Технически, электронная почта может даже использовать пробелы, если они заключены в кавычки, например. "Это действительный адрес электронной почты" @email.com
* Изменить: я заменил ^
и $
на \A
и \z
, чтобы предотвратить многострочную ошибку привязки при тестировании рельсов.
* Редактировать: Спасибо @Barry за то, что регулярное выражение разрешало пробелы. Обновлено регулярное выражение с помощью \S, чтобы предотвратить электронные письма с неправильными пробелами. Несколько точек все еще разрешены, так как адрес электронной почты@@oo.bar.com является приемлемым адресом.
/\b[A-Z0-9._%a-z\-][email protected](?:[A-Z0-9a-z\-]+\.)+[A-Za-z]{2,4}\z/
Это то, что я использую для проверки электронной почты.
Большинство из этих других ответов слишком ограничены или допускают неправильные адреса. Поэтому лучше отказаться от того, чтобы быть слишком строгим, что может помешать пользователям и просто получить основные права.
1. Наиболее распространенный прецедент:
validates :email, ..., format: { with: /\A[^@\s][email protected]([^@.\s]+\.)+[^@.\s]+\z/ }
2. Чтобы также разрешить [email protected]
или [email protected]
, используйте это:
validates :email, ..., format: { with: /\A[^@\s][email protected]([^@.\s]+\.)*[^@.\s]+\z/ }
Ни один из вышеперечисленных заметок не ищет CAPTCHA, записи dns, черные списки доменов dns, черные списки IP и электронные письма с подтверждением.
Для реальной проверки подлинности в домене электронной почты это можно использовать вместо: https://gist.github.com/9200104
Эта лошадь тщательно избита и превращается в кусочек.
Недостаточно репутации для добавления комментария, но если вы собираетесь использовать регулярное выражение Devise, и вы уже используете Devise, то вы можете просто использовать:
validates :email, presence: true, format: Devise.email_regexp
Здесь регулярное выражение электронной почты, которое я использовал некоторое время:
\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b
Это от здесь
^[email protected][\w]+\S[^\s]+$
Краткое улучшение первого ответа
Для проверки подлинности электронной почты я придумываю это регулярное выражение,
/^[\w\d][email protected][\w\d]+(\.[\w\d]+)+$/
Не знаю, насколько это поможет вам, но отлично работает для меня.
Если кто-то найдет ошибку в любом адресе электронной почты, ответьте мне, чтобы я мог больше поработать над этим.
use: /\A[^@\s][email protected][^@\s]+\z/
Он утверждает, что в локальной папке или домене нет @символов или пробелов и что существует один символ @, разделяющий локальную часть и домен.
Более важно: требуется проверка по электронной почте
По мере того как создается больше tlds, это мышление вперед.
Это от Devise , промышленный стандарт для аутентификации.
Лучший способ проверки электронной почты и пароля в Rails:
class User < ActiveRecord::Base
attr_accessor :password
EMAIL_REGEX = /^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$/i
validates :username, :presence => true, :uniqueness => true, :length => { :in => 3..20 }
validates :email, :presence => true, :uniqueness => true, :format => EMAIL_REGEX
validates :password, :confirmation => true #password_confirmation attr
validates_length_of :password, :in => 6..20, :on => :create
before_save :encrypt_password
after_save :clear_password
def encrypt_password
if password.present?
self.salt = BCrypt::Engine.generate_salt
self.encrypted_password= BCrypt::Engine.hash_secret(password, salt)
end
end
def clear_password
self.password = nil
end
end
Драйвер для шифрования пароля
gem 'bcrypt', :require => 'bcrypt'
Здесь решение, например,
действителен для формата электронной почты:
[email protected],[email protected],[email protected]
неверно для:
[email protected]
и т.д., как пространство между словами.
\A[\w+\.-]+\@[a-z]+\.[a-z]{3}\z
validates :email, presence: true ,format: { with: /\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i }
Здесь мы используем.
Мы предполагаем, что это "что-то" @ "что-то" . "что-то" (2-4 символа). Он должен охватывать любые "обычные" письма.
/^([a-zA-Z0-9_\-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([a-zA-Z0-9\-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$/
В неанглийских местах вам может потребоваться проверить электронные письма с акцентированными (юникодными) символами, такими как čšēīū и т.д.
Этот метод проверяет возвращаемый nil
как знак неудачной проверки электронной почты в таких локалях:
def validate_unicode_email email
/\A[\w\u00C0-\u017F\-]+(\.[\w\u00C0-\u017F\-]+)[email protected][\w\u00C0-\u017F\-]+\.[\w]{2,6}$/.match email
end
Это будет передавать электронные письма типа [email protected]
, ā[email protected]ājās.lv
, [email protected]_domain.org
validates_format_of :email, :with => /\A[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]+\z/i