“Modificador desconhecido 'g' em…” ao usar preg_match no PHP?

95

Este é o regex que estou tentando usar:

/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/gim

Encontrei-o neste site e funciona muito bem quando o experimento. Mas assim que coloco em meu código, recebo esta mensagem:

Warning: preg_match() [function.preg-match]: Unknown modifier 'g' in C:\xampp\htdocs\swebook\includes\classes.php on line 22

Alguém pode explicar o que está errado e por que está funcionando naquele site e não no meu código?

Nike
fonte
1
Poderíamos ajudá-lo melhor se soubéssemos exatamente o que você está tentando fazer com a regex. E você precisa de uma ajuda melhor - ou a regex precisa, de qualquer maneira. De todas as regexes de e-mail mal escritas disponíveis nesse site, você pode muito bem ter escolhido a pior. : /
Alan Moore
2
Para sua informação, seu regexp vai validar OK estes tipos de e-mails: "-.-.-.--. @ - algum-- domínio--.com" e esses tipos de e-mails VÁLIDOS NÃO validarão: "info @ subdomínio. domínio.com ". Por último, mas não menos importante, \ w é MUITO PERIGOSO porque o PHP preg usa Expressões Regulares Compatíveis com Perl e NÃO POSIX como Javascript. Se o PHP for executado em um servidor que não seja localizado nos EUA / Reino Unido, \ w também corresponderá às letras acentuadas, então você corresponderia a "àèìòù@domain.com" tem um e-mail válido. Leia aqui para mais detalhes: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

Respostas:

174

Não há modificador gpara preg_match. Em vez disso, você deve usar a preg_match_allfunção.

Então, em vez de:

preg_match("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/gim", ....)

usar:

preg_match_all("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/im", ....)
codadicto
fonte