Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 正则表达式与电子邮件的乐趣;顶级域不是必需的,应该是_Php_Regex - Fatal编程技术网

Php 正则表达式与电子邮件的乐趣;顶级域不是必需的,应该是

Php 正则表达式与电子邮件的乐趣;顶级域不是必需的,应该是,php,regex,Php,Regex,我正在尝试创建一个正则表达式,它将使用PHP过滤有效的电子邮件,并且遇到了一个与我对正则表达式的理解相冲突的问题。这是我正在使用的代码 if (!preg_match('/^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+.[a-zA-Z]{2,4}$/', $string)) { return $false; } 从我研究过的材料来看,这应该允许@前面的内容是多个字母、数字、下划线和句点,然后允许多个字母和数字,然后需要一个句点,然后是顶级域的两到四个字母 但是,现在它忽略了拥有顶

我正在尝试创建一个正则表达式,它将使用PHP过滤有效的电子邮件,并且遇到了一个与我对正则表达式的理解相冲突的问题。这是我正在使用的代码

if (!preg_match('/^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+.[a-zA-Z]{2,4}$/', $string)) {
return $false;
}
从我研究过的材料来看,这应该允许@前面的内容是多个字母、数字、下划线和句点,然后允许多个字母和数字,然后需要一个句点,然后是顶级域的两到四个字母

但是,现在它忽略了拥有顶级域部分的要求。例如a@b.c显然是有效的,应该是,但是a@b也返回为有效,我希望ti标记为非有效

我肯定我错过了一些东西,但在浏览谷歌一个小时后,我不知道它可能是什么。有人能解答这个难题吗


编辑:答案到达这里的速度使这个网站优于它的竞争对手。干得好

也许你应该读这篇文章,而不是自己翻滚。本文还讨论了您可能不希望使用正则表达式验证电子邮件地址的原因,并提供了3个正则表达式,您可以考虑使用这些表达式而不是自己的。当它不是组的一部分时:'/^[-a-zA-Z0-9.]+@[-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/' 否则,它将等于任何字母:

. - 任何符号,但不包括换行符\n如果不使用 \点符号 [.]-符号组内的点符号
正则表达式中的单点表示匹配任何字符。当然,当顶级域丢失时,也当它存在时,is就是这么做的

因此,您应该这样更改代码:

if (!preg_match('/^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/', $string)) {
    return $false;
}

顺便说一下:比正则表达式当前允许的要多

这是我见过的规范与现实生活之间最合理的权衡:

[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
当然,您必须删除换行符,如果有更多顶级域可用,您必须更新换行符。

来自页面:Kohana项目的Geert De Deckere开发了一个近乎完美的换行符:

/^[-_a-z0-9\'+*$^&%=~!?{}]++(?:\.[-_a-z0-9\'+*$^&%=~!?{}]+)*+@(?:(?![-.])[-a-z0-9.]+(?<![-.])\.[a-z]{2,6}|\d{1,3}(?:\.\d{1,3}){3})(?::\d++)?$/iD

但是PHP filter_var$email、filter_VALIDATE_email中也有一个内置函数,但它似乎正在开发中。还有另一个严肃的解决办法:。我认为PEAR解决方案是最好的。

您的正则表达式不匹配a@b.c.d.Is它应该匹配任何电子邮件地址,这意味着只需检查它是否有效?使用filter\u VALIDATE\u EMAIL常量检查PHP自己的filter\u var方法。我想我可以用它。这与我从多个渠道得知的情况不同。我发现[.]更具可读性,而不是\。它把这个问题解决了。角色进入自己的组。同意。虽然没有什么不同。都是\。而且[.]仍然说传递的电子邮件是有效的。我刚刚执行了var_dumppreg_match'/^[-a-zA-Z0-9.]+@[-a-zA-Z0-9]+\.[a-zA-Z]{2,4}$/','a@basd'; 它打印的是int0,这是错误的是的,我发现了我这边的错误。对于早些时候的错误答复,我深表歉意。john@some.domain.co.uk或john@example.co.uk无法使用该正则表达式进行验证。同意您的链接。我想,在我开始更多地参与进来并妨碍我之前,我应该让它发挥作用。还尝试了你的代码。同样的结果,它不需要点,也不需要点进行验证。这对PHP有效吗?我问,因为它看起来是一个Perl模块?Perl模块只是为您提供了一种通过正则表达式运行东西的简单方法。我遇到了筛选器的一些限制,一个不受限制的顶级域大小,所以我将尝试使用PEAR。谢谢什么是无限制的顶级域名大小?据我所知,tld最多可以包含5个字符。博物馆和域名最多可以包含63个字符。