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

19 January 2011

เมื่อมีการใช้งาน ฟังก์ชัน 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 ได้เลย








บทความในหมวดที่่น่าสนใจ อื่นๆ PHP Learning

21 Jan 11 การใช้งาน Meta characters ใน Regular Expressions ของ PHP อ่าน 1097 14 Oct 11 การเชื่อมต่อ facebook และ ล็อกอิน แบบ popup ด้วย php sdk v.3.1.1 อ่าน 1006 13 Oct 11 แนะนำการใช้งาน การเชื่อมต่อ facebook ด้วย php sdk v.3.1.1 อ่าน 885 06 Jun 11 แนวทางการกำหนด expired header ให้กับรูปภาพ ด้วย php อย่างง่าย อ่าน 815

บทความคนเข้าอ่านวันนี้

22 Apr 10 ประยุกต์ tooltip มากกว่า 1 ตัวใน ฟอร์ม ด้วย jQuery อ่าน 5185 17 Nov 09 พิมพ์ข้อมูลใน textbox เพื่อ เพิ่มรายการใน listbox ด้วย jQuery อ่าน 4713 25 Sep 08 ตรวจสอบนามสกุลไฟล์ ก่อนทำการอัพโหลด อ่าน 3333 19 Oct 08 คำสั่ง SQL functions อ่าน 4491 13 Oct 08 คำสั่ง SQL ORDER BY อ่าน 7547 13 Oct 08 คำสั่ง SQL BETWEEN อ่าน 9316 06 Mar 11 แนะนำ ปลั๊กอิน comment ตัวใหม่ของ facebook อ่าน 3438 04 Mar 09 ใช้ jQuery ย้ายค่าระหว่าง multiple list box อย่างง่าย อ่าน 6980 19 Nov 10 ทางเลือก อัพโหลดไฟล์ใน ckeditor ด้วย ajax file manager อ่าน 2244 05 Oct 10 สร้าง login logout และกำหนด permission ของ facebook ด้วย php sdk อ่าน 5847 03 Feb 11 การใช้งาน character classes ใน Regular Expressions ของ PHP อ่าน 1329 08 Feb 12 Google map API v.3 กับ jQuery ลากจุดหา ชื่อตำแหน่ง และ พิกัด ค่า latitude longitude อ่าน 322 07 Sep 10 ใช้ ckeditor กับ filemanager ด้วย php รองรับ ฟังก์ชัน javascript อ่าน 3495 04 Nov 09 ประยุกต์สร้าง pdf ไฟล์ จาก tcpdf class ด้วย php รองรับภาษาไทย อ่าน 5408 15 Mar 11 ทบทวน JavaScript SDK ของ facebook อ่าน 1590 08 Oct 08 การสร้างปุ่มด้วย CSS อ่าน 4677 22 Mar 10 ทบทวนคำสั่ง break และ continue ใน javascript อ่าน 2487 04 Oct 08 SQL คืออะไร อ่าน 7631 18 Aug 10 ใช้ php ดึงรูปภาพ จากโฟลเดอร์ มาแสดง พร้อม เทคนิค แบ่งหน้า อ่าน 4736 05 Nov 08 CSS สร้างเมนูแนวนอน 2 ชั้นโดยไม่ใช้ javascript และตาราง table อ่าน 10432
จำนวนผู้เยี่ยมชม 798291
คน 2012 © Copyright ninenik.com. All rights reserved.