Rails - REGEX для проверки подлинности электронной почты

Я ищу регулярное выражение для проверки электронной почты, чтобы узнать, действительно ли оно или нет. У меня есть следующее:

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] не возвращается как действительная, когда она должна быть. Любые мысли или предложения для лучшего регулярного выражения?

Спасибо

Ответы

Ответ 1

Мой снимок (см. комментарий и ссылку выше):

^[email protected]+$

Ответ 2

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

Не просите меня объяснить это! Это было из плагина проверки, который я с тех пор потерял, поскольку все, что мне нужно, - это регулярное выражение электронной почты.

Ответ 3

Ответ @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 является приемлемым адресом.

Ответ 5

Большинство из этих других ответов слишком ограничены или допускают неправильные адреса. Поэтому лучше отказаться от того, чтобы быть слишком строгим, что может помешать пользователям и просто получить основные права.

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

Эта лошадь тщательно избита и превращается в кусочек.

Ответ 6

Недостаточно репутации для добавления комментария, но если вы собираетесь использовать регулярное выражение Devise, и вы уже используете Devise, то вы можете просто использовать:

validates :email, presence: true, format: Devise.email_regexp

Ответ 7

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

\b[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}\b

Это от здесь

Ответ 8

^[email protected][\w]+\S[^\s]+$

Краткое улучшение первого ответа

Ответ 9

Для проверки подлинности электронной почты я придумываю это регулярное выражение,

/^[\w\d][email protected][\w\d]+(\.[\w\d]+)+$/

Не знаю, насколько это поможет вам, но отлично работает для меня.

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

Ответ 10

use: /\A[^@\s][email protected][^@\s]+\z/

Он утверждает, что в локальной папке или домене нет @символов или пробелов и что существует один символ @, разделяющий локальную часть и домен.

Более важно: требуется проверка по электронной почте

По мере того как создается больше tlds, это мышление вперед.

Это от Devise , промышленный стандарт для аутентификации.

Ответ 11

Лучший способ проверки электронной почты и пароля в 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'

Ответ 13

validates :email, presence: true ,format: { with: /\A([\w+\-]\.?)[email protected][a-z\d\-]+(\.[a-z\d\-]+)*\.[a-z]+\z/i }

Ответ 14

Здесь мы используем.

Мы предполагаем, что это "что-то" @ "что-то" . "что-то" (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})(\]?)$/

Ответ 15

В неанглийских местах вам может потребоваться проверить электронные письма с акцентированными (юникодными) символами, такими как čšēīū и т.д.

Этот метод проверяет возвращаемый 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

Ответ 16

validates_format_of :email, :with => /\A[A-Za-z0-9._%+-][email protected][A-Za-z0-9.-]+\.[A-Za-z]+\z/i