«Modificateur inconnu 'g' dans…» lors de l'utilisation de preg_match en PHP?

93

Voici le regex que j'essaie d'utiliser:

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

Je l'ai trouvé sur ce site , et cela fonctionne très bien quand je l'essaye. Mais dès que je le place dans mon code, je reçois ce message:

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

Quelqu'un peut-il expliquer ce qui ne va pas et pourquoi cela fonctionne sur ce site Web et non dans mon code?

Nike
la source
1
Nous pourrions mieux vous aider si nous savions exactement ce que vous essayez de faire avec la regex. Et vous avez besoin d'une meilleure aide - ou le regex le fait, de toute façon. De toutes les expressions régulières de courrier électronique mal rédigées disponibles sur ce site, vous avez peut-être choisi la pire. : /
Alan Moore
2
Pour info, votre expression régulière va valider OK ces types de mails: "-.-.-.--. @ - some--domain--.com" et ces types de mails VALIDES ne valideront PAS: "info @ subdomain. domain.com ". Last but not least \ w est TRES DANGEREUX car PHP preg utilise des expressions régulières compatibles Perl et PAS POSIX comme Javascript. Si PHP fonctionne sur un serveur qui n'est pas localisé aux États-Unis / au Royaume-Uni, \ w correspondra également aux lettres accentuées, vous correspondriez donc à "àèìòù@domaine.com" qui a un courrier valide. Lisez ici pour plus de détails: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

Réponses:

170

Il n'y a pas de modificateur gpour preg_match. Au lieu de cela, vous devez utiliser la preg_match_allfonction.

Donc au lieu de:

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

utilisation:

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