【发布时间】:2012-09-02 22:45:48
【问题描述】:
我正在编写一个只需要接受所需电子邮件地址的本地组件的注册表单。域组件固定到站点。我试图通过有选择地从 Django 为EmailField 提供的validators.validate_email 复制来验证它:
email_re = re.compile(
r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*" # dot-atom
# quoted-string, see also http://tools.ietf.org/html/rfc2822#section-3.2.5
r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-\011\013\014\016-\177])*"'
r')@((?:[A-Z0-9](?:[A-Z0-9-]{0,61}[A-Z0-9])?\.)+[A-Z]{2,6}\.?$)' # domain
r'|\[(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}\]$', re.IGNORECASE) # literal form, ipv4 address (SMTP 4.1.3)
validate_email = EmailValidator(email_re, _(u'Enter a valid e-mail address.'), 'invalid')
以下是我的代码。我的主要问题是我无法调整正则表达式。在这一点上,我只是在http://www.pythonregex.com/ 的正则表达式测试器中对其进行测试,但是它失败了:
^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$
这似乎传递了不受欢迎的字符,例如?
我的领域的整个代码,在这个阶段不一定相关,但我不介意对此发表评论:
class LocalEmailField(CharField):
email_local_re = re.compile(r"^([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*)$", re.IGNORECASE)
validate_email_local = RegexValidator(email_re, (u'Enter a valid e-mail username.'), 'invalid')
default_validators = [validate_email_local]
编辑:澄清一下,用户只是在@ 之前输入文本,因此我不需要在验证器中验证@domain.com。
编辑 2:所以表单字段和标签将如下所示:
所需的电子邮件地址:[---可键入区域---] @domain.com
【问题讨论】:
-
为什么不正常验证邮件,然后检查是否
email.endswith('@domain.com')? -
用户没有输入@domain.com,它将被设置为表单中字段之后的标签。用户只需在@ 之前输入电子邮件字段的第一部分
-
所以基本上
"[^@]*"? -
我的问题显然写得很糟糕,尽管我不知道如何改进它。用户在任何时候都不会输入文本
@domain.com,他们只输入电子邮件的用户名。 -
你明确地允许 '?'在那个正则表达式中(你确定 ? 不是电子邮件用户名部分的有效部分......我认为规则非常宽松......)
标签: python regex django email-validation