“ Unknown modifier 'g' in …” เมื่อใช้ preg_match ใน PHP?


94

นี่คือ regex ที่ฉันพยายามใช้:

/^(\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
เราสามารถให้ความช่วยเหลือได้ดีขึ้นหากเรารู้แน่ชัดว่าคุณกำลังพยายามทำอะไรกับ regex และคุณต้องการความช่วยเหลือที่ดีกว่า - หรือ regex ก็ทำอยู่ดี จาก regexes อีเมลที่เขียนไม่ดีทั้งหมดที่มีอยู่ในไซต์นั้นคุณอาจเลือกตัวที่แย่ที่สุด : /
Alan Moore

2
FYI regexp ของคุณจะตรวจสอบความถูกต้องของอีเมลประเภทนี้: "-. -.-.--. @ - some--domain--.com" และประเภทของอีเมล VALID เหล่านี้จะไม่ตรวจสอบความถูกต้อง: "info @ โดเมนย่อย domain.com " สุดท้าย แต่ไม่ท้ายสุด \ w เป็นอันตรายอย่างมากเพราะ PHP preg ใช้ Perl Compatible Regular Expressions และไม่ใช่ POSIX เช่น Javascript หาก PHP ทำงานบนเซิร์ฟเวอร์ที่ไม่ใช่ US / UK localized \ w จะจับคู่ตัวอักษรที่เน้นเสียงด้วยดังนั้นคุณจะจับคู่ "àèìòù@domain.com" มีเมลที่ถูกต้อง อ่านรายละเอียดเพิ่มเติมได้ที่นี่: it.php.net/manual/en/function.preg-replace.php#92443
Marco Demaio

คำตอบ:


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", ....)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.