การหนีอักขระพิเศษใน Regular Expressions ของ PHP
สมมติว่าเราต้องการทำให้ อักขระพิเศษหมายถึงตัวมันเอง สำหรับสิ่งนี้ จำเป็นต้องหนีมันโดยใช้แบ็กสแลช ลองดูตัวอย่าง
ตัวอย่าง
ในตัวอย่างต่อไปนี้ ผู้เขียน regex ต้องการ
ให้รูปแบบการค้นหาดูเหมือนว่า: ตัวอักษร
'a' ตามด้วยเครื่องหมายบวก '+' ตามด้วย
ตัวอักษร 'x' อย่างไรก็ตาม ผู้เขียนโค้ด
ไม่ได้หนีอักขระ '+' ดังนั้น
รูปแบบการค้นหาจริง ๆ แล้วดูเหมือนว่า:
ตัวอักษร 'a' หนึ่งครั้งหรือมากกว่า หลังจากนั้น
ตัวอักษร 'x':
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a+x#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'a+x ! ! !'
ตัวอย่าง
และตอนนี้ผู้เขียนได้หนีเครื่องหมายบวกด้วยแบ็กสแลช
ตอนนี้รูปแบบการค้นหาก็เป็นไปตามที่ต้องการ: ตัวอักษร
'a' ตามด้วยเครื่องหมายบวก
'+' ตามด้วยตัวอักษร 'x'
<?php
$str = 'a+x ax aax aaax';
$res = preg_replace('#a\+x#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'! ax aax aaax'
ตัวอย่าง
ในตัวอย่างนี้ รูปแบบดูเหมือนว่า: ตัวอักษร
'a' ตามด้วยจุด '.' ตามด้วย
ตัวอักษร 'x':
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a\.x#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'! abx azx'
ตัวอย่าง
ในตัวอย่างต่อไปนี้ ผู้เขียนลืมหนี สแลช และ regex จับคู่สตริงย่อยทั้งหมด เพราะจุดที่ไม่ได้หนีหมายถึง อักขระใดๆ:
<?php
$str = 'a.x abx azx';
$res = preg_replace('#a.x#', '!', $str);
?>
ผลลัพธ์ที่เขียนลงในตัวแปรจะเป็นดังนี้:
'! ! !'
ตัวอย่าง
โปรดสังเกตว่าหากคุณลืม แบ็กสแลชสำหรับจุด (เมื่อมันควร หมายถึงตัวมันเอง) - สิ่งนี้อาจ มองไม่เห็น:
<?php
preg_replace('#a.x#', '!', 'a.x'); // จะคืนค่า '!' ตามที่เราต้องการ
?>
มองเห็นด้วยตาว่าทำงานถูกต้อง (เนื่องจากจุด
หมายถึงอักขระใดๆ รวมถึงจุดธรรมดา
'.') แต่หากเปลี่ยนสตริง
ที่ทำการแทนที่ - เราจะเห็น
ข้อผิดพลาดของเรา:
<?php
preg_replace('#a.x#', '!', 'a.x abx azx'); // จะคืนค่า '! ! !' ในขณะที่คาดหวัง '! abx azx'
?>