“Pengubah tak dikenal 'g' in…” saat menggunakan preg_match di PHP?

93

Ini adalah regex yang saya coba gunakan:

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

Saya menemukannya di situs ini , dan berfungsi dengan baik saat saya mencobanya di sana. Tetapi segera setelah saya memasukkannya ke dalam kode saya, saya mendapatkan pesan ini:

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

Adakah yang bisa menjelaskan apa yang salah, dan mengapa itu berfungsi di situs web itu dan bukan di kode saya?

Nike
sumber
1
Kami dapat memberi Anda bantuan yang lebih baik jika kami tahu persis apa yang Anda coba lakukan dengan regex. Dan Anda membutuhkan bantuan yang lebih baik - atau regex membutuhkannya. Dari semua regex email yang ditulis dengan buruk yang tersedia di situs itu, Anda mungkin telah memilih yang terburuk. : /
Alan Moore
2
FYI, regexp Anda akan memvalidasi OK jenis email ini: "-.-.-.--. @ - some--domain--.com" dan jenis email yang VALID ini TIDAK akan memvalidasi: "info @ subdomain. domain.com ". Last but not least \ w SANGAT BERBAHAYA karena PHP preg menggunakan Perl Compatible Regular Expressions dan BUKAN POSIX seperti Javascript. Jika PHP berjalan pada server yang tidak dilokalkan untuk AS / Inggris, \ w akan cocok juga dengan huruf beraksen sehingga Anda akan mencocokkan "àèìòù@domain.com" memiliki surat yang valid. Baca di sini untuk detail lebih lanjut: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

Jawaban:

170

Tidak ada pengubah guntuk preg_match. Sebaliknya, Anda harus menggunakan preg_match_allfungsinya.

Jadi, alih-alih:

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

menggunakan:

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