我的模式有一些问题:
/([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}@(([A-Z0-9]+([-][A-Z0-9])*){2,}\.)+([A-Z0-9]+([-][A-Z0-9])*){2,}/i
它匹配电子邮件地址,我对此规则有疑问:
[A-Z0-9\.\_\+\-]*
如果我删除星号它可以工作,但我希望这个字符为0或更多。我在http://regexpal.com/上进行了测试,但是它在preg_match_all(PHP)上有效 - 无法正常工作
由于
答案 0 :(得分:5)
为什么不使用PHP filter_var()
filter_var('test@email.com', FILTER_VALIDATE_EMAIL)
没有好的正则表达式来验证电子邮件地址。如果你绝对必须使用正则表达式,那么可以看看Validate an E-Mail Address with PHP, the Right Way.虽然,这绝不是一个完美的衡量标准。
编辑:经过一番挖掘后,我遇到了Mailparse。
Mailparse是解析的扩展 并使用电子邮件。它 可以处理»RFC 822和»RFC 2045 (MIME)兼容的消息。
Mailparse是基于流的,这意味着 它不会保留内存中的副本 它处理的文件 - 所以它是 交易时非常有效率 大信息。
答案 1 :(得分:1)
首先,有足够的资源可用。快速搜索“电子邮件验证正则表达式”会产生大量结果......包括This One ...
其次,问题不在*
字符中。问题在于整个区块。
([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}
看看那是做什么的。它基本上是尽可能多地匹配alpha-numerics,然后尽可能多地匹配其他字符的alpha-numerics,然后重复至少3次,最多64次。这可能是很多人物......
相反,你可以这样做:
([A-Z0-9][A-Z0-9\.\_\+\-]{2,63})
最多会导致与64个字符的电子邮件匹配。
哦,this is the pain of parsing emails with regex
还有很多其他资源可用于验证电子邮件地址(包括filter_var
)。做一些搜索,看看流行的框架是如何做到的......
答案 2 :(得分:0)
试试这个正则表达式:
/^[A-Z0-9][A-Z0-9\.\_\+\-]{3,64}@([A-Z0-9][-A-Z0-9]*\.)+[A-Z0-9]{2,}$/i
但是像@Russell Dias所说,你不应该使用正则表达式来发送电子邮件。
答案 3 :(得分:0)
整个组后你有数量修饰符:
([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}
所以这需要至少3个字母字符,如下所示:
A5 ________ @ gmail.com
不起作用,但是这个:
一个____一个___一个___ @ gmail.com
将完成这项工作。更好地找到一个经过良好测试的正则表达式。
此外,您没有开始和结束分隔符,因此类似的内容将通过:
&^$@#&$^@#&aaa5a55a55a@gmail.comADA;'DROP TABLE :)
答案 4 :(得分:0)
虽然我同意Russel Dias的观点,但我相信你的问题在于整个版块:
([A-Z0-9]+[A-Z0-9\.\_\+\-]*){3,64}
基本上你说,你想要的;