2016-02-25 96 views
0

我们都知道了电子邮件地址验证是一个敏感的问题,也有关于对付它不编码整个RFC的最佳途径这么多意见。但自2009年以来,它变得更加困难,我还没有真正看到任何人解决IDN的问题。的preg_match验证(国际域名)

这里是我一直使用的是什么:

preg_match(/^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,6}\z/i) 

这将为大多数电子邮件地址,但如果我需要匹配一个非拉丁文的电子邮件地址是什么工作?例如: - 鲍勃@中国。中国,或[email protected]рф完整列表

here。 (请注意列表底部的所有非拉丁域名扩展名。)

关于此主题的信息可以找到here,我想他们在说的是这些新字符将被简单地理解为'.xn - fiqz9s '和'.xn - p1ai'在机器级别上,但我不是100%确定的。

如果是,这是否意味着我需要考虑让我的代码下面唯一的变化? (对于域扩展名如.travelersinsurance和.sandvikcoromant)

preg_match(/^[a-z0-9._%+-][email protected][a-z0-9.-]+\.[a-z]{2,20}\z/i) 

注意:这是不是与此页面上找到的讨论Using a regular expression to validate an email address

+1

这不是重复的,它要求的东西,当引有人问根本不存在。 –

+0

@Stilleur国际域名方面(IDN的)验证不被任何该网页上的讨论。 – Vince

+0

@Vince是的,对不起。正如我刚刚标记你的问题。我问自己,我怎样才能取消它(我赞成它,因为它是非常interresting)。 – Stilleur

回答

-1

这是我最终想出来的。

preg_match(/^[\pL\pM*+\pN._%+-][email protected][\pL\pM*+\pN.-]+\.[\pL\pM*+]{2,20}\z/u) 

此使用Unicode正则表达式像\ PL\ PM * +\对-N帮我处理任何语言的字符和数字。

\ pL任何类型的来自任何语言的信件,大写或小写。

\ pM * +匹配零个或多个组合标记的代码点。意图与另一个字符(例如,重音,变音符号,封闭盒等)组合的字符。

\对-N任何数字。

表达上面会很好地工作像[email protected]和正常的电子邮件地址,像刺耳的电子邮件地址A.S中3_yÄhমহাজোটেরOO文%网+d-fελληνικά@πyÄhooαράδειγμα.δοκιμή。

这并不是说我不信任的人能在输入自己的电子邮件地址,但人不犯错误,我可以在其他情况下使用此代码。例如:我需要仔细检查现有10,000个电子邮件地址列表的完整性。此外,我总是被教导不信任用户输入并始终过滤。

UPDATE

我刚刚发现解析为UTF-8含量正常的字符串,它不能正常使用电子邮件字段,因为浏览器转换领域工作时,像phpliveregex.com网站,虽然这个完美的作品时,测试和本地的内容类型为正常拉丁文。因此,像鲍勃@中国的电子邮件地址。中国,或[email protected]рф不通过服务器[email protected],或[email protected]接收到之前被转换。我原来的过滤器中唯一真正缺少的是从域扩展中包含连字符。

这里是最后的版本:

preg_match('/^[a-z0-9%+-._][email protected][a-z0-9-.]+\.[a-z0-9-]{2,20}\z/i'); 
+0

这个正则表达式不允许所有可能的有效电子邮件地址。见http://stackoverflow.com/questions/4816424/are-single-quotes-legal-in-the-name-part-of-an-email-address – deceze

2

我会坚持与尝试和真正的建议,你应该给他们发送验证邮件。不需要一个花哨的正则表达式,需要一次又一次地更新。假设他们知道他们的电子邮件地址并让他们输入。

这就是当这种情况出现时我一直在做的。如果有的话我会让他们两次输入他们的电子邮件。它可以让你腾出更多时间在网站/项目的重要部分。

+0

我爱这些网站,要求我输入两次(复制粘贴);-) – 2016-02-25 22:00:30

+2

'onpaste =“返回false;”'(手指枪:皮尤pew) – Iwnnay

3

考虑:你弥补自己的新的正则表达式没有根据RFC完整规范验证地址每次,你要做的仅仅是这种情况,使用“异国情调“的电子邮件地址在网络上变得更糟。你正在发明官方RFC规范的一些新的ad-hoc子集或超集;这意味着你要么有假阳性或假阴性或两者兼而有之,你会拒绝的人使用他们的实际地址,因为你的正则表达式不占他们正确的,否则你会接受这实际上是无效的地址。

添加到即使地址是语法上有效的,仍然不意味着一)地址实际上(仍然)存在,B)属于该用户或c)实际上可以接收电子邮件。在事物的授予计划中,验证语法是一个极其不重要的问题。

如果你要在所有的验证语法,要么做一个非常粗略的常规检查,这肯定不会拒绝,验证根据所有RFC规则的任何有效的地址(例如/[email protected]+/);不要在你刚刚想到的一半之间做一些严格但并非真正的验证。