«Неизвестный модификатор 'g' в…» при использовании preg_match в PHP?

93

Это регулярное выражение, которое я пытаюсь использовать:

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

Я нашел его на этом сайте , и он отлично работает, когда я пробую его там. Но как только я помещаю его в свой код, я получаю такое сообщение:

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

Может ли кто-нибудь объяснить, что не так и почему это работает на этом веб-сайте, а не в моем коде?

Nike
источник
1
Мы могли бы помочь вам лучше, если бы точно знали, что вы пытаетесь сделать с регулярным выражением. И вам нужна лучшая помощь - или, по крайней мере, регулярное выражение. Из всех плохо написанных регулярных выражений электронной почты, доступных на этом сайте, вы, возможно, выбрали худшее. : /
Алан Мур
2
К вашему сведению, ваше регулярное выражение будет проверять ОК для этих типов писем: «-.-.-.--. @ - some--domain--.com», и эти типы ДЕЙСТВИТЕЛЬНЫХ писем НЕ будут проверять: «info @ subdomain. domain.com ". И последнее, но не менее важное: \ w ОЧЕНЬ ОПАСНО, потому что PHP preg использует Perl-совместимые регулярные выражения, а НЕ POSIX, как Javascript. Если PHP работает на сервере, который не локализован для США / Великобритании, \ w будет соответствовать также буквам с диакритическими знаками, поэтому вы должны сопоставить, что "àèìòù@domain.com" имеет действительную почту. Подробнее читайте здесь: it.php.net/manual/en/function.preg-replace.php#92443
Марко Демайо,

Ответы:

170

Модификатора gдля preg_match. Вместо этого вы должны использовать preg_match_allфункцию.

Так что вместо:

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

использование:

preg_match_all("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/im", ....)
codaddict
источник