Php Can';无法使电子邮件验证正常工作
在寻找一个好的电子邮件验证程序后,我发现并决定它看起来是最有可能的候选程序。我为电子邮件验证实现了以下类(它继承的RegexMatch类根据关联配置数组的“针”键中提供的正则表达式验证字符串):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
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
编辑:我还忘了提及,因为这是一个验证类,它只需要传递包含电子邮件地址的字符串,而不需要传递其他内容。我不想在非电子邮件地址数据中传递包含有效电子邮件地址的字符串。我知道您是通过使用
^pattern\u goes\u here$
来实现这一点的,但是这个正则表达式比我过去使用的大多数正则表达式都要高级,而且我不确定^and$应该放在哪里。如果你也能帮忙的话,我会很感激的 完全验证电子邮件地址是一项非常棘手的工作
这里有一个列表,包括测试,显示了不同的解决方法,但是没有一个能够通过所有的测试
得分最高的表达式是PHP的filter_var()当前使用的表达式,它基于Michael Rushton的正则表达式
我强烈建议您使用完全验证电子邮件地址是一项非常棘手的工作 这里有一个列表,包括测试,显示了不同的解决方法,但是没有一个能够通过所有的测试 得分最高的表达式是PHP的filter_var()当前使用的表达式,它基于Michael Rushton的正则表达式
我强烈建议您使用如果您想添加
^
和$
锚定,这里将是:
^(?&address)$ /x';
您还需要验证
^(?&address)$ /x';