อักขระคั่น (Delimiters) ในการใช้งาน Regular Expressions ของ PHP

เขียนเมื่อ 13 ปีก่อน โดย Ninenik Narkdee
php regular expression

คำสั่ง การ กำหนด รูปแบบ ตัวอย่าง เทคนิค ลูกเล่น การประยุกต์ การใช้งาน เกี่ยวกับ php regular expression

ดูแล้ว 17,249 ครั้ง


เมื่อมีการใช้งาน ฟังก์ชัน Regular Expressions รูปแบบ pattern จะต้องปิดด้วย อักขระคั่นเสมอ
โดยอักขระคั่นที่สามารถกำหนดได้ เป็นดังนี้
- ไม่เป็นตัวอักษร
- ไม่เป็น  เครื่องหมาย  backslash  ( \ )
- ไม่เป็นช่องว่าง

โดยทั่วไปจะใช้เครื่องหมาย forward slashes ( / ) ,hash signs (#) และ tildes (~)

ตัวอย่างรูปแบบการใช้งาน อักขระคั่น ที่มีรูปแบบถูกต้อง

/foo bar/   --- ใช้ /
#^[^0-9]$#   --- ใช้ #
+php+   --- ใช้ +
%[a-zA-Z0-9_-]%  --- ใช้ %

ในกรณีมีการใช้ตัวอักขระคั่นใน pattern สามารถเลี่ยงการเกิด error โดยการใช้เครื่องหมาย backslash ( \ ) เช่น

มีการใช้ตัวอักขระคั่นคือ /  กับคำว่า http://
รูปแบบ pattern ที่ยังไม่ถูกต้อง จะเป็น

/http:///

จะเห็นว่ามีการใช้ / ซี่งเป็นอักขระคั่นใน pattern คือในข้อความว่า http:// ดังนั้น เพื่อให้รูปแบบ pattern ถูกต้อง
จึงต้องใช้เครื่องหมาย backslash ( \ ) 
จะได้รูปแบบ pattern ที่ถูกต้องดังนี้คือ

/http:\/\//

ได้จากการเปลี่ยน // ใน pattern เป็น \/\/

หรือจะใช้วิธีการเปลี่ยนตัวอักขระคั่นอื่นแทน เพื่อให้อ่านได้ง่ายขึ้น เช่นใช้เครื่องหมาย hash sign ( # ) แทน
จะได้เป็น

#http://#

นอกจากนั้น ยังสามารถใช้ฟังก์ชัน preg_quote() ใน php เพื่อหลีกเลี่ยงปัญหา การกำหนด ตัวอักขระพิเศษใน
pattern ซื่งได้แก่ 

. \ + * ? [ ^ ] $ ( ) { } = ! < > | : -

รวมถึงตัวอักขระคั่น ที่ใช้ใน pattern ด้วย

ตัวอย่าง

<?php
$data_test2="http://www.google.com";
$my_pattern="http://";
$my_pattern=preg_quote($my_pattern,'/');
echo preg_match('/'.$my_pattern.'/',$data_test2); // ผลลัพธ์ เท่ากับ 1
// กรณีรูปแบบไม่ซับซ้อน เราสามารถเขียนเข้าไปในส่วนใช้งานโดยตรงได้
// โดยตัดบรรทัดที่ 3 กับ 4 ออก
// แล้วเปลี่บน บรรทัดที่ 5 เป็น
// echo preg_match('/http\:\/\//',$data_test2); // ผลลัพธ์ เท่ากับ 1
?>

อธิบาย
จากตัวอย่าง ต้องการหาว่า ตัวแปร $data_test2 มีรูปแบบข้อความ http://
ตามตัวแปร $my_pattern อยู่หรือไม่

แต่เนื่องจากตัวแปร $my_pattern มีตัวขระพิเศษ คือ : (colon) และตัวอักขระคั่น คือ //
อยู่ จึงจำเป็นต้องกำหนดรูปแบบ pattern ให้ถูกต้องก่อน

โดยการใช้ ฟังก์ชัน preg_quote ตามโค้ดด้านบน  บรรทัดที่ 4
ซึ่งจะทำให้ได้รูปแบบ pattern  เป็น http://

เมื่อทำการทดสอบ จะได้ผลลัพธ์เท่ากับ 1 คือหมายถึง มีคำว่า http:// อยุ่
หากต้องการทดสอบว่า ถ้าไม่ใช้คำสั่ง preg_quote จะมีผลอย่างไร? ให้ทำการ comment บรรทัดที่ 4
แล้วทดสอบ รันผลลัพธ์ดู

เราสามารถกำหนด เงื่อนไขการตรวจสอบรูปแบบ pattern โดยการเพิ่ม pattern modifiers เช่น
ตัวอย่างเบื้องต้นในที่นี้ คือตัวอักษร i เงื่อนไขคือ เป็นตัวพิมพ์เล็ก หรือตัวพิมพ์ใหญ่ ก็ได้ ซึ่งจะได้
รูปแบบ pattern ดังนี้

/http\:\/\//i

ตัวอย่างการใช้งานใน php

<?php
$data_test2="HTTP://www.google.com";
echo preg_match('/http\:\/\//i',$data_test2);  // ผลลัพธ์ เท่ากับ 1
?>


สามารถศึกษาเพิ่มเติมได้ด้วยตัวเองที่
http://www.php.net/manual/en/regexp.introduction.php


หมายเหตุ::
เนื้อหาข้างต้นเป็นการอธิบายตามความเข้าใจของผู้เขียน ซึ่งเพิ่งจะศึกษาเกี่ยวกับ
Regular Expressions ของ PHP  โดยอ้างอิงจากลิ้งค์

http://www.php.net/manual/en/regexp.reference.delimiters.php

ดังนั้น เพื่อความเข้าใจที่ถูกต้อง แนะนำให้ศึกษาจาก ลิ้งค์ดังกล่าวโดยตรง
ส่วนใคร ที่ต้องการศึกษาไปพร้อมๆ กับผู้เขียน ก็ติดตามเนื้อหา เกี่ยวกับ
Regular Expressions ของ PHP ได้ที่นี้ www.ninenik.com ได้เลย



กด Like หรือ Share เป็นกำลังใจ ให้มีบทความใหม่ๆ เรื่อยๆ น่ะครับ



อ่านต่อที่บทความ









เนื้อหาที่เกี่ยวข้อง









URL สำหรับอ้างอิง





คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )







เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ