0

我正在尝试在 php 程序中接收电子邮件,并且正在使用以下正则表达式

([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b)siU

这似乎可以很好地获取您的标准电子邮件。比如me @ gmail.comyou @ hotmail.com

失败的地方是结尾为 co.uk 的电子邮件。现在我尝试在我的正则表达式中添加 co.uk

([a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|com|co.uk|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)\b)siU

但这只是给我与原始正则表达式相同的输出。电子邮件的输出在哪里, you@co 。我也试过加入英国。我在这个上缺少什么?是第二个时期扔掉它吗?

理想情况下,我试图让它捕获所有带有 .com .net .org co.uk .au .ca 的电子邮件。基本上我正在搜索所有美国、英国、澳大利亚和加拿大的电子邮件。谁能发现我的错误是能够正确输出非美国电子邮件you @ yoursite.co.uk而不是you @ yoursite.co

谢谢你。例如,显示的电子邮件中的空格仅用于发布此内容。

编辑:我不是要验证电子邮件,它是一系列电子邮件,可以是数组中的任何内容,我试图只为数据库捕获特定的电子邮件。很抱歉最初没有说清楚。

Edit2:这是我的问题的工作字符串。感谢大家

^([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})(\]?)$^
4

5 回答 5

1

不要使用正则表达式来验证电子邮件地址。使用正确执行此操作的库。

有关详细信息,请参阅我知道如何验证电子邮件地址,直到我阅读 RFC

于 2013-04-25T06:53:20.420 回答
0

|co.uk|

尝试(不在 [] 中,点表示任何东西,但断开链接)

|co\.uk|
于 2013-04-25T06:48:58.590 回答
0

你必须像这样逃避这个点。

co\.uk

如果您尝试仅匹配有效的电子邮件,则此正则表达式应该可以解决问题

(\s)?(([^\s]+)\@([^\s]+))
于 2013-04-25T06:49:13.333 回答
0

不要对电子邮件使用正则表达式,你不会喜欢它,而且你会失败。

filter_var() http://php.net/manual/en/function.filter-var.php

FILTER_VALIDATE_EMAIL http://www.php.net/manual/en/filter.filters.validate.php

于 2013-04-25T06:54:44.807 回答
0

我在这个上缺少什么?

您正在向非捕获组添加术语。那么基于您的正则表达式的任何输出如何包含非捕获组中的任何内容?更不用说您添加的术语中的错误 nacholibre 提到了。

于 2013-04-25T06:52:09.687 回答