preg_match_all игнорировать слова - PullRequest
0 голосов
/ 06 июня 2011

Я пытаюсь создать регулярное выражение для захвата писем, заканчивающихся не на .info / .con, не содержащих aaa / bbb.

Это правильный синтаксис?

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 @)

Спасибо за ваш ответ.

Этот синтаксис работает отлично СМОТРИТЕ ЗДЕСЬ (спасибо STEMA) за исключением строки, содержащей пробелы.

Например:

$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 ]

1 голос
/ 06 июня 2011

Если я правильно понимаю ваши требования, то это будет регулярное выражение, которое вы можете использовать вместе с ответом @Tomalak.

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

Этот шаблон соответствует тому, что вы не хотите.

.*@.*(?:aaa|bbb) соответствует aaa или bbb после @

, * \.(?:com|info)$ является другой частью, это соответствует, если ваш адрес электронной почты заканчивается на .com или .info

Вы можете увидеть его онлайн здесь на Regexr

Обновление:

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

Это будет соответствовать aaa или bbb и строка должна заканчиваться .com или .info

Посмотреть онлайн здесь, на Regexr

1 голос
/ 08 июня 2011

Вот решение:

#(?<=^|\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]);
        }
}

1007 * Сердечно *

1 голос
/ 06 июня 2011

Просто используйте положительное выражение и убедитесь, что оно ничего не соответствует.

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

Кроме того, нет необходимости использовать preg_match_all, если вас просто интересует, соответствует шаблон или нет.

...