"Modificador desconocido 'g' en ..." cuando se usa preg_match en PHP?

93

Esta es la expresión regular que estoy tratando de usar:

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

Lo encontré en este sitio y funciona muy bien cuando lo pruebo. Pero tan pronto como lo coloco en mi código, aparece este mensaje:

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

¿Alguien puede explicar qué está mal y por qué funciona en ese sitio web y no en mi código?

Nike
fuente
1
Podríamos brindarle una mejor ayuda si supiéramos exactamente lo que está tratando de hacer con la expresión regular. Y necesita una mejor ayuda, o la expresión regular la necesita , de todos modos. De todas las expresiones regulares de correo electrónico mal escritas disponibles en ese sitio, es posible que haya elegido la peor. : /
Alan Moore
2
FYI, su regexp va a validar OK este tipo de correos: "-.-.-.--. @ - some--domain--.com" y este tipo de correos VÁLIDOS NO validarán: "info @ subdominio. dominio.com ". Por último, pero no menos importante, \ w es MUY PELIGROSO porque PHP preg utiliza Expresiones regulares compatibles con Perl y NO POSIX como Javascript. Si PHP se ejecuta en un servidor que no está localizado en EE. UU. / Reino Unido, \ w también coincidirá con letras acentuadas, por lo que coincidirá con "àèìòù@domain.com" tiene un correo válido. Lea aquí para obtener más detalles: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

Respuestas:

170

No hay ningún modificador gpara preg_match. En su lugar, debes usar la preg_match_allfunción.

Entonces en lugar de:

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

utilizar:

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