preg_match_all忽略单词

时间:2011-06-06 07:36:08

标签: php regex preg-match-all

我尝试创建一个正则表达式来捕获不包含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);

亲切

3 个答案:

答案 0 :(得分:1)

只需使用正面表达并检查它是否与任何内容都不匹配。

if (preg_match(...) == 0)

此外,如果您只是对模式是否匹配感兴趣,则无需使用preg_match_all

答案 1 :(得分:1)

如果我理解你的要求,那么这就是你可以和@Tomalak一起使用的正则表达式。

preg_match('#.*@.*(?:aaa|bbb)|\.(?:com|info)$#ui', $html, $emails);

此模式与想要的内容相匹配。

.*@.*(?:aaa|bbb)@

之后的aaa或bbb匹配

\.(?:com|info)$是另一部分,如果您的电子邮件地址以.com.info

结尾,则匹配

您可以在线查看here on Regexr

<强>更新

.*(?:aaa|bbb).*\.(?:com|info)$

这将匹配aaabbb,字符串必须以.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]);
        }
}

亲切