„Nieznany modyfikator 'g' w…” podczas używania preg_match w PHP?

93

Oto wyrażenie regularne, którego próbuję użyć:

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

Znalazłem go na tej stronie i działa świetnie, gdy go tam wypróbuję. Ale gdy tylko umieszczę go w swoim kodzie, otrzymuję następujący komunikat:

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

Czy ktoś może wyjaśnić, co jest nie tak i dlaczego działa w tej witrynie, a nie w moim kodzie?

Nike
źródło
1
Moglibyśmy udzielić ci lepszej pomocy, gdybyśmy dokładnie wiedzieli, co próbujesz zrobić z wyrażeniem regularnym. A ty potrzebujesz lepszej pomocy - lub regex nie, w każdym razie. Ze wszystkich źle napisanych wyrażeń regularnych e-maili dostępnych w tej witrynie, być może wybrałeś najgorszy. : /
Alan Moore
2
FYI, Twoje wyrażenie regularne potwierdzi poprawność tego typu wiadomości: "-.-.-.--. @ - some--domain--.com" i tego typu PRAWIDŁOWE wiadomości NIE będą sprawdzać poprawności: "info @ subdomena. domena.com ”. Wreszcie \ w jest BARDZO NIEBEZPIECZNE, ponieważ PHP preg używa wyrażeń regularnych zgodnych z Perlem, a NIE POSIX, jak JavaScript. Jeśli PHP działa na serwerze, który nie jest zlokalizowany w USA / Wielkiej Brytanii, \ w dopasuje również litery akcentowane, tak aby dopasować „ìòù@domena.com” ma prawidłową pocztę. Przeczytaj tutaj, aby uzyskać więcej informacji: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

Odpowiedzi:

170

Nie ma modyfikatora gdla preg_match. Zamiast tego musisz użyć preg_match_allfunkcji.

Więc zamiast:

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

posługiwać się:

preg_match_all("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/im", ....)
codaddict
źródło