рдЧрдВрднреАрд░рддрд╛ рд╕реЗ, рдЗрд╕реЗ рд░реЛрдХреЗрдВред рдпрд╣ рд╕рдордп рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХреА рдмрд░реНрдмрд╛рджреА рд╣реИред Google рдкрд░ рдПрдХ
рдирд┐рдпрдорд┐рдд рдИрдореЗрд▓ рдЬрд╛рдВрдЪ рдХреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ, рдЙрд╕ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ - рдФрд░ рдЖрдк рдХреБрдЫ рддрд╛рдЬрд╝реА рд╣рд╡рд╛ рдореЗрдВ рд╕рд╛рдВрд╕ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдореБрдЭреЗ рдПрдХ рдмрд╣реБрдд рдкреНрд░рд╕рд┐рджреНрдз рдЙрджреНрдзрд░рдг рдпрд╛рдж рд╣реИ:
рдЬрдм рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рддреЛ рдХреБрдЫ рд▓реЛрдЧ рд╕реЛрдЪрддреЗ рд╣реИрдВ, "рдУрд╣, рдореИрдВ рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред"
рдЕрдм рдЙрдиреНрд╣реЗрдВ рджреЛ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред
рдЬреЗрдореА рдЬрд╝реНрд╡рд┐рдиреНрд╕реНрдХреА , regex.info
рдПрдХ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдХреБрдЫ рдЕрдВрд╢реЛрдВ рд╡рд╛рд▓реЗ рд░реЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реЗ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рд╣реИ:
class User < ActiveRecord::Base
# from https://github.com/plataformatec/devise,
# Rails
validates_format_of :email, :with => /\A[^@]+@([^@\.]+\.)+[^@\.]+\z/
end
( ), :
class User < ActiveRecord::Base
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]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i
end
:
class User < ActiveRecord::Base
validates :email, :with => EmailAddressValidator
end
class EmailValidator < ActiveModel::Validator
EMAIL_ADDRESS_QTEXT = Regexp.new '[^\\x0d\\x22\\x5c\\x80-\\xff]', nil, 'n'
EMAIL_ADDRESS_DTEXT = Regexp.new '[^\\x0d\\x5b-\\x5d\\x80-\\xff]', nil, 'n'
EMAIL_ADDRESS_ATOM = Regexp.new '[^\\x00-\\x20\\x22\\x28\\x29\\x2c\\x2e\\x3a-\\x3c\\x3e\\x40\\x5b-\\x5d\\x7f-\\xff]+', nil, 'n'
EMAIL_ADDRESS_QUOTED_PAIR = Regexp.new '\\x5c[\\x00-\\x7f]', nil, 'n'
EMAIL_ADDRESS_DOMAIN_LITERAL = Regexp.new "\\x5b(?:#{EMAIL_ADDRESS_DTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x5d", nil, 'n'
EMAIL_ADDRESS_QUOTED_STRING = Regexp.new "\\x22(?:#{EMAIL_ADDRESS_QTEXT}|#{EMAIL_ADDRESS_QUOTED_PAIR})*\\x22", nil, 'n'
EMAIL_ADDRESS_DOMAIN_REF = EMAIL_ADDRESS_ATOM
EMAIL_ADDRESS_SUB_DOMAIN = "(?:#{EMAIL_ADDRESS_DOMAIN_REF}|#{EMAIL_ADDRESS_DOMAIN_LITERAL})"
EMAIL_ADDRESS_WORD = "(?:#{EMAIL_ADDRESS_ATOM}|#{EMAIL_ADDRESS_QUOTED_STRING})"
EMAIL_ADDRESS_DOMAIN = "#{EMAIL_ADDRESS_SUB_DOMAIN}(?:\\x2e#{EMAIL_ADDRESS_SUB_DOMAIN})*"
EMAIL_ADDRESS_LOCAL_PART = "#{EMAIL_ADDRESS_WORD}(?:\\x2e#{EMAIL_ADDRESS_WORD})*"
EMAIL_ADDRESS_SPEC = "#{EMAIL_ADDRESS_LOCAL_PART}\\x40#{EMAIL_ADDRESS_DOMAIN}"
EMAIL_ADDRESS_PATTERN = Regexp.new "#{EMAIL_ADDRESS_SPEC}", nil, 'n'
EMAIL_ADDRESS_EXACT_PATTERN = Regexp.new "\\A#{EMAIL_ADDRESS_SPEC}\\z", nil, 'n'
def validate(record)
unless record.email =~ EMAIL_ADDRESS_EXACT_PATTERN
record.errors[:email] << 'is invalid'
end
end
end
. ? , , ( ) email-,
RFC. , , .
, email- ,
3.2.4 3.4.1. , , . ( , @), :
! $ & * - = ^ ` | ~ # % ' + / ? _ { }
? , , . , тАФ :
"Look at all these spaces!"@ example.com
!
, email- :
class User < ActiveRecord::Base
validates_format_of :email, :with => /@/
end
, ? @. , . , .
, email , ? , , , .
!, . . , . , ?
. :
qwiufaisjdbvaadsjghb@gmail.com
! , : email-! , email , . , , , . , ? тАФ . , , . .
. , . , , . тАФ , .
, , @. , тАФ :
/.+@.+\..+/i
, тАФ .
:
. jetman!