PHP正则表达式如何检测现有的正确邮箱域名后缀?

例:example@example.com的域名后缀是.com,我看了很多书上和网上的写法都类似于用[a-z]来匹配最后的域名后缀,但是我发现如果后缀乱写的话也能通过检测,比如.ckk .ksf .sef .wed等等无效的域名后缀,我在很多论坛的注册页面也试过乱写邮箱域名后缀,居然都能通过!!!

//正则表达式再再次改版,能检测带._-符号的用户名和带-符号或二级域名的邮箱
if (isset($_POST['submit'])) {
if (preg_match("/^[a-z0-9]+[\._-]?[a-z0-9]+@[a-z0-9]+-?[a-z0-9]*(\.[a-z0-9]+-?[a-z0-9]+)?\.(com|org|net|com.cn|org.cn|net.cn|cn)$/i", $_POST['email'])) {
echo "<br/>检测带._-符号的用户名和带-符号或二级域名的邮箱有效。";
}
else{
echo "<br/>检测带._-符号的用户名和带-符号或二级域名的邮箱无效!";
}
}
上面是我自己写的一段检测代码,检测域名后缀我使用了(com|org|net|com.cn|org.cn|net.cn|cn)的方法直接匹配,但是正确的顶级域名有上百个,全写上去好像太长,更新也不方便,有没有其他方法可以简化,能不能用数组???菜鸟求正则表达式高手解救!
最新回答
温茶

2024-05-06 02:28:25

这个是IT群里的朋友!我不去群里了,在这里帮你把问题解决了吧!

其实严格说来,正则表达式只是一个模型匹配,所以直接使用模型匹配时我们有一个高通原理,也就是说匹配出来的内容是要大于你所需要的内容。就比此题来说,后边可以匹配任何一个合规则的内容,而不可能精确地直接是你想要的内容——这就是高通,如果非要匹配到你想要的内容,使用正则运算有时是非常不合适的!所以这里不建议你使用这方式,或者是部分使用这种方式的形式。

高通就是通过你不全是你想要的,但你想要的一定全在里边。

那么,为什么不考虑使用ajax的方式呢?后台自己设计一会数据库,@前半段使用正则表这式,扣后半段直接使用数据存储的内容,这样可以精确到任何一个你想要的。

因为这里你想要的与不想要的其实也很模糊,你也不知道ckk这个域名在以后是不会被启用!那么你可以使用数据库方式,由管理员自由添加!不用去修改那将来的表达式的!

但事实上很少人用这种方式——他们都在使用注册时邮箱认证的方式,也就是说,发到你邮箱里一封信,辅助你完成注册,这种情况虽然是高通,其他实他只是方便用户能输入正确,而不是要的确信数据,任何设计都要记着这句话——任何客户端的信息都是不可信的!就算用JS完成了正则,那么如果对方有意屏掉您的JS这十分容易的!所以你的正则根本不是用来验证,而是方便用户。

正是这种原因,高通的理由也是其存在的一个原因!就算使用了我说的数据库,利用ajax来检查,那么别人照样可以让你的ajax不工作,而且,不是服务器通过了,邮箱就一定有人注册的!所以从这方面上来讲,数据库的实现意义也不大!

根据js的特点,客户端的验证没有必要太这于麻烦,就算是服务端的验证,建议你的也只采用这种方式即可。没有使用数据库的必要的——这个代价与达到的效果是不成比例的!

说完了,其实等于我也不解决!
追问
呵呵,带着这个疑问去各大知名网站,进行注册测试,除了几个规定要什么邮箱才能注册的网站,其他的都基本能乱写一通浑水摸鱼混过js检测。估计开发的时候也考虑到特殊用户群或者这只是个小模块不必花程序员太多时间和精力。这也难怪各大网站都会有一个注册邮件点击回复链接注册机制,基本能解决这种恶意注册的问题,来获得真实用户,如果没有这种机制的网站,注册流程设计上就有问题了。最后,谢谢你的耐心解答。
瑾沫流年

2024-05-06 04:43:16

这个貌似真的不能验证,最起码是不能用正则简单验证,因为企业邮箱的后缀是自己随意申请的,比如aaa@bbb.net也有可能是真的,如果真的要验证,可能有专门的验证接口链接吧,没研究过了,希望对你有帮助。。。。

还要说明一下,就算现在@123.ckk没有,可能明年就会出现,还是我上面说的,不确定的东西是不能用正则验证的.
天生萌货

2024-05-06 01:45:19

验证域名的有效性,php有个自带的函数可影直接验证。邮箱的格式正不正确可以用正则判断。
oО绿帽侠

2024-05-06 06:27:54

后面的就随他去吧····前面检测正确就好了···后面.com.xxx··谁知道以后有啥呢~
追问
不是啊,不是正确的域名后缀,说明这个邮箱就是无效邮箱嘛!
追答
你怎么知道是不是有效呢···如果它是123@sina.com··发不了过去··也算是无效嘛····
追问
不是啊,你可能理解错我意思我,我是想检测邮箱最后面那个顶级域名,123@sina.com乱写错123@sina.cvm或者123@sina.dom,这些就不是有效邮箱,我试了几个论坛的注册居然都通过注册了。
追答
现在的邮箱验证基本都忽略后面的····就像你说的··它时刻在新增······如果非要验证··那就一个个判断吧····