DevToolPal
ไทย

ทดสอบ Regex แบบ PCRE

ทดสอบ regular expression แบบ PHP / Perl ด้วยเอนจิน PCRE2 ตัวจริง รองรับ recursion, possessive quantifier, \K และอื่น ๆ

ทำงานในเครื่อง ไม่มีการอัปโหลด

ตัวเลือก

ข้อความทดสอบ

0 ตัวอักษร · 0 B

ผลลัพธ์

ผลลัพธ์จะแสดงที่นี่

เครื่องมือนี้ทำอะไร

ตัวทดสอบ regex แบบ PCRE ตรวจ regular expression กับข้อความของคุณโดยใช้ไลบรารี PCRE2 ตัวจริง ซึ่งเป็นเอนจินเดียวกับที่ PHP เครื่องมือสไตล์ Perl และเว็บเซิร์ฟเวอร์จำนวนมากใช้ รายการที่ตรงจะถูกไฮไลต์ แต่ละรายการแสดงพร้อมตำแหน่งและ capture group และสามารถใส่ข้อความแทนที่เพื่อดูผลการแทนที่แบบ preg_replace ได้

การทดสอบกับเอนจินจริงสำคัญ เพราะ regular expression ของ PCRE และ JavaScript ต่างกันในจุดเล็ก ๆ แต่สำคัญ แพทเทิร์นที่ใช้ได้ในตัวทดสอบบนเบราว์เซอร์อาจคอมไพล์ไม่ผ่านใน PHP หรือจับคู่ได้ผลต่างออกไป

วิธีใช้งาน

  1. พิมพ์แพทเทิร์นโดยไม่ต้องมีตัวคั่นลงใน แพทเทิร์น PCRE
  2. วางข้อความที่ต้องการค้นหาลงใน ข้อความทดสอบ
  3. เปิด modifier ที่ต้องการ: g สำหรับทุกรายการที่ตรง (เหมือน preg_match_all), i, m, s, x, U และ u สำหรับ \w, \d และ \b ที่รองรับ Unicode
  4. หากต้องการ กรอก แทนที่ด้วย เพื่อพรีวิวการแทนที่ ใช้ $1 หรือ ${1} สำหรับกลุ่มแบบลำดับเลข ${name} สำหรับกลุ่มที่ตั้งชื่อ และ $0 สำหรับข้อความที่ตรงทั้งหมด

แพทเทิร์นที่ไม่ถูกต้องจะแสดงข้อความแจ้งข้อผิดพลาดของ PCRE2 เอง พร้อมตำแหน่งในแพทเทิร์นที่เอนจินหยุดทำงาน

ตัวอย่าง

แพทเทิร์นเริ่มต้น \((?:[^()]++|(?R))*\) ค้นหาวงเล็บที่เปิดปิดครบคู่ โดยจับคู่วงเล็บหนึ่งคู่ที่ภายในมีอักขระที่ไม่ใช่วงเล็บ หรือมีแพทเทิร์นทั้งหมดซ้อนอยู่อีกครั้งแบบ recursive ในข้อความตัวอย่าง จะพบ (a, g(b, c)) และ ((x), y) และข้ามวงเล็บที่ไม่ได้ปิดตอนท้าย regular expression ของ JavaScript เขียนแบบนี้ไม่ได้

ลองใช้ (?<amount>\d+(?:\.\d+)?)\s+(?<cur>USD|EUR) กับข้อความแทนที่ ${cur} $1 เพื่อสลับจำนวนเงินกับรหัสสกุลเงินในบรรทัดที่สอง

ความสามารถของ PCRE ที่ควรรู้

  • Possessive quantifier (*+, ++, ?+) และ atomic group ((?>...)) จะไม่คืนสิ่งที่จับคู่ไปแล้ว ช่วยป้องกัน backtracking ที่ไม่สิ้นสุด
  • \K รีเซ็ตจุดเริ่มต้นของรายการที่ตรง เป็นทางเลือกแบบง่ายแทน lookbehind
  • Recursion ด้วย (?R), (?1) หรือ (?&name) ใช้จับคู่โครงสร้างที่ซ้อนกัน
  • Inline modifier เช่น (?i) เปลี่ยนพฤติกรรมเฉพาะบางส่วนของแพทเทิร์น

เคล็ดลับ

  • ใน PHP ให้ครอบแพทเทิร์นด้วยตัวคั่น เช่น /.../ หรือ ~...~ และเลือกตัวที่ไม่มีอยู่ในแพทเทิร์น จะได้ไม่ต้อง escape
  • เปิด u เมื่อข้อความมีตัวอักษรที่มีเครื่องหมายเน้นเสียงหรืออักขระ CJK เพื่อให้ \w จับคู่ได้

คำถามที่พบบ่อย

› เครื่องมือนี้ต่างจากตัวทดสอบ regex ของ JavaScript อย่างไร?

หน้านี้รัน PCRE2 ซึ่งเป็นเอนจินเบื้องหลังฟังก์ชัน preg_ ของ PHP, Nginx, Apache และเครื่องมืออื่นอีกมาก โดยคอมไพล์เป็น WebAssembly รองรับไวยากรณ์ที่ JavaScript ไม่มี เช่น recursion ด้วย (?R), possessive quantifier อย่าง a++, atomic group, \K, กลุ่ม (?P<name>...) และ modifier x กับ U

› ต้องพิมพ์ตัวคั่นอย่าง /pattern/i ด้วยไหม?

ไม่ต้อง ป้อนเฉพาะแพทเทิร์น แล้วเปิด modifier ด้วยช่องทำเครื่องหมาย ใน PHP `preg_match('/\d+/i', $s)` เทียบเท่ากับแพทเทิร์น `\d+` ที่เปิด ไม่สนตัวพิมพ์เล็กใหญ่ ไว้

› ทำไมจึงได้ข้อความ "match limit exceeded"?

บางแพทเทิร์น เช่น ^(a+)+$ กับสตริงยาวที่ไม่ตรง จะเกิดการ backtrack จำนวนครั้งแบบเอกซ์โพเนนเชียล ตัวทดสอบจะหยุดหลังห้าล้านขั้นเพื่อให้หน้าเว็บยังตอบสนองได้ PHP มีกลไกป้องกันคล้ายกันคือ pcre.backtrack_limit และ preg_match จะคืนค่า false เมื่อถึงขีดจำกัดนี้

› ข้อความของฉันถูกอัปโหลดหรือไม่?

ไม่ โมดูล PCRE2 WebAssembly ถูกดาวน์โหลดเพียงครั้งเดียว และทุกอย่างทำงานในเบราว์เซอร์ของคุณ