我尝试创建一个正则表达式来捕获不包含aaa / bbb的.info / .con结尾的电子邮件。
这是正确的语法吗?
Eg: // search email ending in .com/.info containing no aaa/bbb
preg_match_all('#((?=.*@.*(?:com|info))(!.*(?:aaa|bbb)).*)#ui', $html, $emails);
要得到这个:
caaac@ccc.com = no
ccc@ccbbb.com = no
cccc@cccc.com = good (address syntax correct + term absent before or after the @)
感谢您的回复。
除了包含空格的字符串外,此语法正常SEE HERE(感谢STEMA)。
e.g:
$string = "email1@address.com blah email2@aaaaess.com blah email3@address.info embbbil4@adress.com";
preg_match_all("#^(?!.*aaa)(?!.*bbb).*@.*\.(?:com|info)$#im", $string, $matches);
亲切
答案 0 :(得分:1)
只需使用正面表达并检查它是否与任何内容都不匹配。
if (preg_match(...) == 0)
此外,如果您只是对模式是否匹配感兴趣,则无需使用preg_match_all
。
答案 1 :(得分:1)
如果我理解你的要求,那么这就是你可以和@Tomalak一起使用的正则表达式。
preg_match('#.*@.*(?:aaa|bbb)|\.(?:com|info)$#ui', $html, $emails);
此模式与不想要的内容相匹配。
.*@.*(?:aaa|bbb)
与@
\.(?:com|info)$
是另一部分,如果您的电子邮件地址以.com
或.info
您可以在线查看here on Regexr
<强>更新强>
.*(?:aaa|bbb).*\.(?:com|info)$
这将匹配aaa
或bbb
,字符串必须以.com
或.info
在线查看here on Regexr
答案 2 :(得分:1)
以下是解决方案:
#(?<=^|\s)(?![\w@]*(?:aaa|bbb|(?:[0-9].*){3,}))[a-z0-9-_.]*@[a-z0-9-_.]*\.(?:com|net|org|info|biz)(?=\s|$)#im
功能:
function get_emails($str){
preg_match_all('#(?<=^|\s)(?![\w@]*(?:aaa|bbb|(?:[0-9].*){3,}))[a-z0-9-_.]*@[a-z0-9-_.]*\.(?:com|net|org|info|biz)(?=\s|$)#im', $str, $output);
if(is_array($output[0]) && count($output[0])>0) {
return array_unique($output[0]);
}
}
亲切