Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.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 Can';无法使电子邮件验证正常工作_Php_Regex_Validation_Email_Phpunit - Fatal编程技术网

Php Can';无法使电子邮件验证正常工作

Php Can';无法使电子邮件验证正常工作,php,regex,validation,email,phpunit,Php,Regex,Validation,Email,Phpunit,在寻找一个好的电子邮件验证程序后,我发现并决定它看起来是最有可能的候选程序。我为电子邮件验证实现了以下类(它继承的RegexMatch类根据关联配置数组的“针”键中提供的正则表达式验证字符串): class电子邮件扩展RegexMatch实现iface\Prop { 常数 /** *用于验证电子邮件地址的正则表达式 * *此正则表达式旨在根据RFC 5322进行验证,并取自 *关于电子邮件验证的post-on-Stack溢出(请参阅链接) * *@linkhttp://www.ietf.or

在寻找一个好的电子邮件验证程序后,我发现并决定它看起来是最有可能的候选程序。我为电子邮件验证实现了以下类(它继承的RegexMatch类根据关联配置数组的“针”键中提供的正则表达式验证字符串):

class电子邮件扩展RegexMatch实现iface\Prop
{
常数
/**
*用于验证电子邮件地址的正则表达式
* 
*此正则表达式旨在根据RFC 5322进行验证,并取自
*关于电子邮件验证的post-on-Stack溢出(请参阅链接)
* 
*@linkhttp://www.ietf.org/rfc/rfc5322.txt, https://stackoverflow.com/questions/201323/what-is-the-best-regular-expression-for-validating-email-addresses/1917982#1917982
*/
图案
/(?(定义)
(?(?&邮箱)|(?&组))
(?(?&name_addr)|(?&addr_spec))
(?(?&显示名称)?(?&角度地址))
(?(?&CFWS)?<(?&addr_spec)>(?&CFWS)?)
(?(?&display_name):(?:(?&mailbox_list)|(?&CFWS));
(?&CFWS)?)
(?(?&短语))
((?(?&邮箱)(?:,(?&邮箱))*)
(?(?&局部)\@(?&域)
(?(?&dot_原子);(?"ed_字符串))
(?(?&dot_原子);(?&domain_文字))
(?(?&CFWS)?\[(?:(?&FWS)?(?&dcontent))*(?&FWS)?
\](?&CFWS)?)
(?(?&dtext)|(?"ed_对))
(((?&NO_WS_CTL)|[\x21-\x5a\x5e-\x7e])
(?(?&ALPHA)|(?&DIGIT)|[!\$%和\'*+-\/=?^`{124}~)
(?(?&CFWS)?(?&atext)+(?&CFWS)?)
(?(?&CFWS)?(?&dot_原子_文本)(?&CFWS)?)
(?(?&atext)+(?:\(?&atext)+)*)
(?[\x01-\x09\x0b\x0c\x0e-\x7f])
(?\\(?&文本))
(((?&NO_WS_CTL)|[\x21\x23-\x5b\x5d-\x7e])
(?(?&qtext)|(?"ed_对))
(?(?&CFWS)?(?&DQUOTE)(?:(?&FWS)?(?&qcontent))*
(?&FWS)?(?&DQUOTE)(?&CFWS)?)
(?(?&atom)|(?"ed_字符串))
(?(&word)+)
#折叠空白
(?(?:(?&WSP)*(?&CRLF))(?&WSP)+)
(((?&NO_WS_CTL)|[\x21-\x27\x2a-\x5b\x5d-\x7e])
(?(?&ctext)|(?"ed|对)|(?&comment))
(?\((?:(?&FWS)?(?&ccontent))*(?&FWS)?\)
((?:(?&FWS)?(?&comment))*
(?:(?:(?&FWS)?(?&comment))|(?&FWS)))
#无空白控制
(?[\x01-\x08\x0b\x0c\x0e-\x1f\x7f])
(?[A-Za-z])
(?           [0-9])
(?\x0d\x0a)
(?          ")
(?[\x20\x09])
)
(?&地址)/x';
公共函数setConfig(数组$config=array())
{
$config=array_merge($config,array('needle'=>self::PATTERN));
返回(父::setConfig($config));
}
公共函数有效()
{
返回((为null($this->getData())
||(parent::isValid());
}
}
我还构建了一个PHPUnit测试,该测试针对从各种来源(主要是维基百科)挑选的有效和无效电子邮件地址的各种排列运行该类

该类似乎在很多更普通的情况下都能正常工作,但它遇到了一些问题,因为它传递了一些应该是无效的电子邮件,而失败了一些应该是正常的电子邮件。我在下面列出了它们:

  • 更多。“更多\不同寻常”@example.com
    (失败,应为有效)
  • ”(),:;[\]@example.com
    (传递,假定无效)
  • 只是“不”right@example.com
    (通过,假定无效)
  • A@b@c@example.com
    (通过,假定无效)
  • 这\真的\不是\\allowed@example.com
    (通过,假定无效)
PHP似乎正确地解析了正则表达式,它不会发出任何错误、警告或通知。另外,我的所有其他测试用例(7个其他有效地址和2个其他无效地址)都通过了测试或失败了,所以我怀疑这是因为我的PHP版本(5.3.8)不支持这里使用的正则表达式语法。但由于我同时有假阳性和假阴性,显然有些地方出了问题。要么我的测试数据不正确(正如我所说,我主要是从维基百科中挑选出来的),要么regex as在某种程度上是不正确的

上面输入的正则表达式是否正确?如果没有,需要进行哪些更正?如果它是正确的,那么我的测试用例是否有问题


编辑:我还忘了提及,因为这是一个验证类,它只需要传递包含电子邮件地址的字符串,而不需要传递其他内容。我不想在非电子邮件地址数据中传递包含有效电子邮件地址的字符串。我知道您是通过使用
^pattern\u goes\u here$
来实现这一点的,但是这个正则表达式比我过去使用的大多数正则表达式都要高级,而且我不确定^and$应该放在哪里。如果你也能帮忙的话,我会很感激的

完全验证电子邮件地址是一项非常棘手的工作

这里有一个列表,包括测试,显示了不同的解决方法,但是没有一个能够通过所有的测试

得分最高的表达式是PHP的filter_var()当前使用的表达式,它基于Michael Rushton的正则表达式


我强烈建议您使用

完全验证电子邮件地址是一项非常棘手的工作

这里有一个列表,包括测试,显示了不同的解决方法,但是没有一个能够通过所有的测试

得分最高的表达式是PHP的filter_var()当前使用的表达式,它基于Michael Rushton的正则表达式


我强烈建议您使用如果您想添加
^
$
锚定,这里将是:

  ^(?&address)$  /x';
您还需要验证
  ^(?&address)$  /x';