Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.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电子邮件正则表达式仍然允许在彼此之后直接使用2点_Php_Regex_Email - Fatal编程技术网

PHP电子邮件正则表达式仍然允许在彼此之后直接使用2点

PHP电子邮件正则表达式仍然允许在彼此之后直接使用2点,php,regex,email,Php,Regex,Email,在PHP中,我使用此正则表达式检查邮件: $rexMail = "/^[a-z0-9\._]+@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i"; 在大多数情况下,这就足够了。但是,该邮件地址对于正则表达式是有效的: 测试。。test@test.com 这应该是不可能的。虽然@符号前面应该有多个点,但不可能有多个点紧跟在后面 我对正则表达式不太在行,我不知道如何解决这个问题 此外,我不太确定@符号后的点数,因为有.co.uk或最差的邮件地址。这里:

在PHP中,我使用此正则表达式检查邮件:

$rexMail = "/^[a-z0-9\._]+@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";
在大多数情况下,这就足够了。但是,该邮件地址对于正则表达式是有效的:

测试。。test@test.com

这应该是不可能的。虽然@符号前面应该有多个点,但不可能有多个点紧跟在后面

我对正则表达式不太在行,我不知道如何解决这个问题

此外,我不太确定@符号后的点数,因为有.co.uk或最差的邮件地址。

这里:

/^([a-z0-9_]\.?)*[a-z0-9_]+@([a-z0-9-_]+\.)+[a-z]{2,3}$/i
@之后的电子邮件地址部分可能是任何有效域,因此您需要允许TLD上方任何数量的。-分隔项-例如,email.staff.mycompany.com是有效主机。此外,顶级域中可以包含2个以上的字符;许多常见的是3(.com、.net等)

但是,VoteyDisciple下面的评论是有效的-从技术上讲,电子邮件地址可以包含

此处:

/^([a-z0-9_]\.?)*[a-z0-9_]+@([a-z0-9-_]+\.)+[a-z]{2,3}$/i
@之后的电子邮件地址部分可能是任何有效域,因此您需要允许TLD上方任何数量的。-分隔项-例如,email.staff.mycompany.com是有效主机。此外,顶级域中可以包含2个以上的字符;许多常见的是3(.com、.net等)


但是,VoteyDisciple下面的评论是有效的-从技术上讲,电子邮件地址可以包含

首先,测试。。test@example.com是一个完全有效的电子邮件地址。没有规定电子邮件地址在@符号之前不能有多个连续的句点字符。事实上,在@符号之前可以有任何字符,包括一些不允许的字符(例如+)。因此,您将拒绝您现在编写的各种完全有效的地址


请参阅,以获取一个简单的表达式,并解释为什么电子邮件地址验证在使用正则表达式时通常会出错。

首先,测试。。test@example.com是一个完全有效的电子邮件地址。没有规定电子邮件地址在@符号之前不能有多个连续的句点字符。事实上,在@符号之前可以有任何字符,包括一些不允许的字符(例如+)。因此,您将拒绝您现在编写的各种完全有效的地址


请参阅,以获取一个简单的表达式,并解释为什么电子邮件地址验证在使用正则表达式时通常会出错。

问题在于字符类如何工作:字符类,如[a-z0-9.]+,表示“其中一个--此规则应用一次或多次”。基本上,character类的规则中没有不能重复字符的内容

诀窍在于,你想用句点分隔“单词”,你必须考虑到这种分组

考虑一下这样的情况:

$rexMail = "/^[a-z0-9_]+(\.[a-z0-9_]+)*@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";
这基本上是说,“一个单词(由字母数字或下划线组成),然后可选地(零次或多次)加上一个点,然后再加上另一个单词。”(可以重复任意多次或几次)


顺便提一下,{1}量词从来都不是必需的,因为默认情况下,如果不指定量词,正则表达式引擎将只搜索一次。

问题在于字符类的工作方式:字符类,如[a-z0-9.]+,意味着“其中一个--此规则应用一次或多次”。基本上,character类的规则中没有不能重复字符的内容

诀窍在于,你想用句点分隔“单词”,你必须考虑到这种分组

考虑一下这样的情况:

$rexMail = "/^[a-z0-9_]+(\.[a-z0-9_]+)*@{1}[a-z0-9-_]+\.{1}[a-z]{2,4}\.?[a-z]{0,2}$/i";
这基本上是说,“一个单词(由字母数字或下划线组成),然后可选地(零次或多次)加上一个点,然后再加上另一个单词。”(可以重复任意多次或几次)

顺便说一下,{1}量词从来都不是必需的,因为默认情况下,如果不指定量词,正则表达式引擎将只搜索它一次。

您可能会发现它很有用。仅仅使用正则表达式几乎不可能实现有效的电子邮件地址检查。然而,本页涉及到几个备选方案

我倾向于使用靠近页面底部的那个。我发现它适用于大多数web应用程序的使用,并对其进行了轻微修改以使用PHP转义:

//courtesy of http://www.regular-expressions.info/email.html, modified to be escaped for PHP string and preg_match
$exp = '[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
if (! preg_match('/^'.$exp.'$/i', $email)) return false;
你可能会发现这很有用。仅仅使用正则表达式几乎不可能实现有效的电子邮件地址检查。然而,本页涉及到几个备选方案

我倾向于使用靠近页面底部的那个。我发现它适用于大多数web应用程序的使用,并对其进行了轻微修改以使用PHP转义:

//courtesy of http://www.regular-expressions.info/email.html, modified to be escaped for PHP string and preg_match
$exp = '[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&\'*+\\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?';
if (! preg_match('/^'.$exp.'$/i', $email)) return false;

您希望确保正则表达式尽可能宽松。由于存在许多有效地址,因此它将不匹配

以下是用于电子邮件语法验证的PHP库:

如果不向他们发送电子邮件,就很难真正验证电子邮件。但SMTP验证在大多数情况下都有效,尽管失败也应视为可能的失败,而不是实际的失败

下面是一个将通过SMTP验证电子邮件的类:
您希望确保正则表达式尽可能宽松。由于存在许多有效地址,因此它将不匹配

以下是用于电子邮件语法验证的PHP库:

如果不向他们发送电子邮件,就很难真正验证电子邮件。但SMTP验证在大多数情况下都有效,尽管失败也应视为可能的失败,而不是实际的失败

下面是一个将通过SMTP验证电子邮件的类:

再次尝试复制正则表达式,我对它进行了编辑以调整一个小问题。您的原始版本就可以了