“Công cụ sửa đổi không xác định 'g' in…” khi sử dụng preg_match trong PHP?


93

Đây là regex tôi đang cố gắng sử dụng:

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

Tôi đã tìm thấy nó trên trang web này , và nó hoạt động tuyệt vời khi tôi thử nó ở đó. Nhưng ngay sau khi tôi đặt nó vào mã của mình, tôi nhận được thông báo sau:

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

Có ai có thể giải thích điều gì sai và tại sao nó hoạt động trên trang web đó mà không phải trong mã của tôi không?


1
Chúng tôi có thể cung cấp cho bạn sự trợ giúp tốt hơn nếu chúng tôi biết chính xác những gì bạn đang cố gắng thực hiện với regex. Và bạn cần trợ giúp tốt hơn - hoặc dù sao thì regex cũng vậy. Trong số tất cả các regex email được viết kém có sẵn trên trang web đó, bạn có thể đã chọn cái tồi nhất. : /
Alan Moore

2
FYI, regexp của bạn sẽ xác thực OK những loại thư này: "-.-.-.--. @ - some--domain--.com" và những loại thư HỢP LỆ này sẽ KHÔNG xác thực: "info @ subdomain. domain.com ”. Cuối cùng nhưng không kém phần quan trọng \ w là RẤT NGUY HIỂM vì PHP sử dụng Biểu thức chính quy tương thích Perl chứ KHÔNG phải POSIX như Javascript. Nếu PHP chạy trên máy chủ không được bản địa hóa Hoa Kỳ / Vương quốc Anh \ w sẽ khớp với các chữ cái có dấu, vì vậy bạn sẽ khớp "àèìòù@domain.com" có một thư hợp lệ. Đọc ở đây để biết thêm chi tiết: it.php.net/manual/en/ Chức năng.preg
Marco Demaio

Câu trả lời:


170

Không có bổ ngữ gcho preg_match. Thay vào đó, bạn phải sử dụng preg_match_allhàm.

Vì vậy, thay vì:

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

sử dụng:

preg_match_all("/^(\w|\.|-)+?@(\w|-)+?\.\w{2,4}($|\.\w{2,4})$/im", ....)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.