“Невідомий модифікатор 'g' у ...” при використанні preg_match у PHP?


94

Це регулярний вираз, який я намагаюся використовувати:

/^(\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

Хто-небудь може пояснити, що не так, і чому він працює на цьому веб-сайті, а не в моєму коді?


1
Ми могли б надати вам кращу допомогу, якби ми точно знали, що ви намагаєтесь зробити із регулярним виразом. І вам потрібна краща допомога - або, звичайно, регулярний вираз це робить. З усіх погано написаних регулярних виразів електронної пошти, доступних на цьому веб-сайті, ви цілком могли вибрати найгірший. : /
Алан Мур

2
FYI, ваш регулярний вираз буде перевіряти нормальність відповідності таких типів повідомлень: "-.-.-.--. @ - 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
Марко Демайо

Відповіді:


171

Немає модифікатора 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", ....)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.