2011-06-06 4 views
0

J'essaie de créer une regex pour capturer les emails ne se terminant pas .info/.con ne contenant pas aaa/bbb.preg_match_all ignore les mots

Est-ce la syntaxe correcte?

Eg: // search email ending in .com/.info containing no aaa/bbb 
preg_match_all('#((?=.*@.*(?:com|info))(!.*(?:aaa|bbb)).*)#ui', $html, $emails); 

Pour obtenir:

[email protected] = no 
[email protected] = no 
[email protected] = good (address syntax correct + term absent before or after the @) 

Merci pour votre réponse.

Cette syntaxe fonctionne bien SEE HERE (merci à STEMA) à l'exception d'une chaîne qui inclut des espaces.

par exemple:

$string = "[email protected] blah [email protected] blah [email protected] [email protected]"; 
preg_match_all("#^(?!.*aaa)(?!.*bbb).*@.*\.(?:com|info)$#im", $string, $matches); 

Cordially

Répondre

1

est ici la solution:

#(?<=^|\s)(?![\[email protected]]*(?:aaa|bbb|(?:[0-9].*){3,}))[a-z0-9-_.]*@[a-z0-9-_.]*\.(?:com|net|org|info|biz)(?=\s|$)#im 

Fonction:

function get_emails($str){ 
    preg_match_all('#(?<=^|\s)(?![\[email protected]]*(?: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]); 
     } 
} 

Cor dially

1

utilisent simplement une expression positive et vérifier qu'il n'a rien match.

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

En outre, il n'y a pas besoin d'utiliser preg_match_all si vous êtes simplement intéressé si un modèle adapté ou non.

+0

Il peut y avoir plusieurs e-mails à capturer et ne contenant pas les mots interdits (aaa | bbb) dans une page HTML pour analyser. – StackOverflowCom

1

Si je comprends bien vos exigences, alors ce serait l'expression rationnelle que vous pouvez utiliser avec la réponse de @Tomalak.

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

Ce modèle correspond à des choses que vous ne faites pas veulent.

.*@.*(?:aaa|bbb) matchs aaa ou bbb après la @

le \.(?:com|info)$ est d'autre part, cela correspond si votre adresse e-mail se termine par .com ou .info

Vous pouvez le voir en ligne here on Regexr

Mise à jour :

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

Cela correspondra aaa ou bbb et la chaîne doit se terminer par .com ou .info

Voir en ligne here on Regexr

+0

Merci pour votre réponse. Les termes de recherche peuvent être avant ou après le signe arobas et entourés de caractères.Ex: Voir ci-dessus – StackOverflowCom

+0

@la_chouette J'ai mis à jour ma réponse, est-ce que j'ai bien répondu aux exigences cette fois? – stema

+0

@stema Tout d'abord, merci encore pour votre aide. C'est presque ça, j'essaie aussi ma main: [ICI] (http://lumadis.be/regex/test_regex.php?id=786) – StackOverflowCom