การใช้งาน character classes ใน Regular Expressions ของ PHP

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

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

ดูแล้ว 21,977 ครั้ง


รูปแบบการขึ้นต้นด้วย เครื่องหมายปีกกาสี่เหลี่ยมเปิด ( [ ) และปิดด้วยด้วยเครื่องหมายปีกกาสี่เหลี่ยมปิด ( ] ) เป้นการใช้งาน Regular Expressions ในส่วนของ character class

โดยหลักของ Character class ตัวอักขระที่อยู่ในปีกกาสี่เหลี่ยม เปิด ปิด ( [] ) หมายถึงเงื่อนไขว่า
มีตัวอักขระ นั้นๆ  ตัวหนึ่งตัวใด หรือไม่ เช่น
ตัวอย่าง

รูปแบบ pattern /[aeiou]/


- หมายถึง ถ้ามีตัวอักษร a หรือ e หรือ i หรือ o หรือ u จะเข้าเงื่อนไขของรูปแบบ pattern

ตัวอย่างการใช้งานร่วมกับ โค้ด PHP

<?php
$data_test="hotmail google yahoo geegle facebook";
echo preg_match_all('/[hfg]/',$data_test,$matches);
// ค่า echo ที่ได้จะเท่ากับ 7 ซึ่งคือจำนวนค่าที่ตรงกับเงือนไขตามรูปแบบ pattern
// โดย เป็นตัว h 2 ตัว ตัว g 4 ตัว และตัว f อีก 1 ตัว
// อยู่ในตัวแปรอาเรย์ชื่อว่า $matches
// มีค่าตังนี้คือ $matches[0]=h;
// $matches[0] เท่ากับ h;
// $matches[1] เท่ากับ g;
// $matches[2] เท่ากับ g;
// $matches[3] เท่ากับ h;
// $matches[4] เท่ากับ g;
// $matches[5] เท่ากับ g;
// $matches[6] เท่ากับ f;
?>

หมายเหตุ::  preg_match_all จะต่างจาก preg_match
ตรงที่ preg_match จะตรวจสอบจนพบค่าแรกที่ตรงกับเงื่อนไข pattern ค่าเดียวเท่านั้น แล้วหยุดการตรวจสอบ
ขณะที่ preg_match_all จะทำการตรวจสอบค่าทั้งหมดที่ตรงกับเงื่อนไข pattern

รูปแบบ pattern จะเข้าเงื่อนไข เมื่อ ตัวอักขระ ตัวหนึ่งตัวใดปรากฏในข้อความที่ต้องการตรวจสอบ เว้นเสียแต่
ที่ตัวอักขระตัวแรกเป็นเครื่องหมาย ( ^ ในที่นี้ ขอเรียกว่าเครื่องหมายตัวชี้) ซึ่งหมายถึง ต้องไม่มีอักขระใดๆ ที่
แสดงใน character class
ตัวอย่าง

รูปแบบ pattern /[^aeiou]/


- หมายถึง ถ้ามีตัวอักษรที่ไม่ใช่ a หรือ e หรือ i หรือ o หรือ u จะเข้าเงื่อนไขของรูปแบบ pattern




สำหรับในกรณีที่ต้องมีการตรวจสอบเครื่องหมายตัวชี้ (^) สามารถกำหนดได้โดย ต้องไม่ให้เครืองหมาย
ตัวชี้ (^) อยู่ที่ตำแหน่งแรก หรือ จะใช้เครื่องหมาย ( \ ) เมื่อต้องการตรวจสอบอักขระนี้ในรูปแบบ pattern เช่น

รูปแบบ pattern /[aeio\^u]/
- หมายถึง ถ้ามีตัวอักษร a หรือ e หรือ i หรือ o หรือ ^ หรือ u จะเข้าเงื่อนไขของรูปแบบ pattern

ถ้ามีการกำหนด Pattern Modifiers เป็น case-insensitive คือใช้ตัว i ซึ่งจะหมายถึง เป็นตัวพิมพ์เล็ก หรือตัว
พิมพ์ใหญ่ก็ได้ ( อ่านเพิ่มเติมเกี่ยวกับ Pattern Modifiers ได้ที่ http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php )

ตัวอย่าง

รูปแบบ pattern /[aeiou]/i


- หมายถึง ถ้ามีตัวอักษร a หรือ e หรือ i หรือ o หรือ u รวมถึงตัวพิมพ์ใหญ่ด้วย จะเข้าเงื่อนไขของรูปแบบ pattern

ตัวอย่าง

รูปแบบ pattern /[^aeiou]/i


- หมายถึง ถ้ามีตัวอักษรที่ไม่ใช่ a หรือ e หรือ i หรือ o หรือ u รวมถึงตัวพิมพ์ใหญ่ด้วย จะเข้าเงื่อนไขของรูปแบบ pattern





ตัวอักขระขีดกลาง หรือเครื่องหมายลบ ( - ) หรือจะเรียกว่า (hyphen) จะถูกใช้สำหรับกำหนดช่วงของตัวอักษร ตัวอย่างเช่น 

รูปแบบ pattern /[d-m]/


- หมายถึง ถ้ามีอักขระช่วงตัวอักษร d ถึง m จะเข้าเงื่อนไข pattern คือ ถ้ามีตัว d e f g h i j k l หรือ m

และสามารถใช้เป็นอักขระตรวจสอบ โดยการใช้เครื่องหมาย ( \ )  ซึ่งโดยทั่วไปจะไว้ด้านหน้า หรือด้านหลังของ
character class
ตัวอย่างเช่น 

รูปแบบ pattern /[d-m\-]/


- หมายถึง ถ้ามีอักขระช่วงตัวอักษร d ถึง m หรือเครื่องหมาย - จะเข้าเงื่อนไข pattern
คือ ถ้ามีตัว d e f g h i j k l หรือ m หรือเครื่องหมาย -





การกำหนด อักขระ ] ต่อท้ายช่วงของ character class
ตัวอย่างเช่น

รูปแบบ pattern /[W-]46]/


- จะไม่ได้หมายถึง จากตัว W ถึงเครื่องหมาย } แต่จะหมายถึงตัวอักขระ 2 ตัว คือ
มีตัว W หรือ -  แล้วตามด้วย 46]
ดังนั้นข้อความ  W46] หรือ -46] จึงเข้าเงื่อนไขตามรูปแบบ pattern ข้างต้น

อยากไรก็ตาม หากมีการตรวจสอบเครื่องหมาย ] ในรูปแบบ pattern จะต้องใช้เครื่องหมาย ( \ )
ตัวอย่างเช่น

รูปแบบ pattern /[W-\]46]/




การใช้งานกับช่วงลำดับของค่า ASCII ยังสามารถใช้สำหรับกำหนดเป็นตัวเลขพิเศษ
ตัวอย่างเช่น

รูปแบบ pattern /[\000-\037]/


- หมายถึง
กำหนดช่วงสำหรับตัวเลขฐาน 8 ช่างค่าตั้งแต่ 000 - 037 
ดูตารางค่า ASCII พร้อมค่าในตัวเลขฐาน 8 ได้ที่
http://www.asciitable.com/

ตัวอย่าง

รูปแบบ pattern /[W-c]/i จะมีค่าเท่ากับ รูปแบบ pattern /[][\^_`wxyzabc]/i


ดูตารางเปรียบเทียบค่า ASCII ได้ที่
http://www.asciitable.com/

นอกจากเราอาจจะพบว่ามีการใช้งาน  backslash character เช่น
\d  --  ตัวเลขทุกตัว 0 - 9
\D  -- ตัวอักขระทุกตัว ยกเว้น เลข 0 - 9
\s  --  ช่องว่างทุกตัว
\S  -- ตัวอักขระทุกตัว ยกเว้นช่องว่าง
\w -- ตัวอักษร ตัวเลข ทุกตัว รวม underscore ( _ ) ยกเว้นตัวอักขระพิเศษ . \ + * ? [ ^ ]  % $ ( ) { } = ! < > | : -
\W  -- ตัวขระพิเศษทุกตัว และช่องว่าง ยกเว้น ตัวอักษร ตัวเลข underscore ( _ )

ปรากฏอยู่ใน character class
ตัวอย่างเช่น

รูปแบบ pattern /[^\W_]/


- พิจารณาแต่ละตัว
- มีเครื่องหมาย ^ แสดงว่าเป็นค่า invert หรือตรงข้าม
- \W คือ ตัวขระพิเศษทุกตัว และช่องว่าง ยกเว้น ตัวอักษร ตัวเลข และ underscore ( _ ) ดังนั้น เป็นค่าตรงข้าม จึงหมายถึง
ตัวอักษร ตัวเลข ทุกตัว ยกเว้นตัวอักขระพิเศษ . \ + * ? [ ^ ]  % $ ( ) { } = ! < > | : -
- _ คือเครื่องหมาย underscore ดังนั้น เป็นค่าตรงข้าม จังหมายถึง ต้องไม่เป็นเครื่องหมาย underscore  ( _ )
- โดยสรุป คือ เป็น ตัวอักษร ตัวเลข ทุกตัว ยกเว้นตัวอักขระพิเศษ . \ + * ? [ ^ ]  % $ ( ) { } = ! < > | : - และ
ไม่เป็นเครื่องหมาย underscore (_)

ตัวอักขระอื่นๆ ที่ไม่ใช่ตัวเลข และตัวอักษร ไม่มีความพิเศษใดๆ ใน character class
หากต้องการตรวจสอบอักขระพิเศษนั้นๆ สามารถใช้เครื่องหมาย ( \ ) กำกับไว้ด้านหน้าได้
ยกเว้น  \, -, ^ ที่อยู่ตำแหน่งเริ่มต้น และเครื่องหมาย ]




ใน Regular Expressions เรายังสามารถใช้งานรูปแบบ POSIX notation
ใน character class ได้ โดยระบุชื่อ POSIX notation  ไว้ในเครื่องหมาย [:  :]
ตัวอย่างเช่น

รูปแบบ pattern /[01[:alpha:]%]/


- หมายถึงเลข 0 หรือ 1 หรือ ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่ หรือ % จะเข้าเงื่อนไขของ pattern


class names ที่ใช้ใน Character classes
alnum     ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่ และตัวเลข
alpha      ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่
ascii         ตัวอักขระทุกตัว ที่มีค่า ascii code ตั้งแต่ 0 - 127
 ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข ตัวอักขระพิเศษ รวมช่องว่าง
blank      ช่องว่าง หรือว่า แท็บ
cntrl      control characters
digit      ตัวเลขอ 0 - 9 (เหมือนกับการใช้งาน \d)
graph     ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข ตัวอักขระพิเศษ ไม่รวมช่องว่าง
lower       ตัวอักษรภาษาอังกฤพิมพ์เล็กทุกตัว
print        ตัวอักษรภาษาอังกฤพิมพ์เล็ก พิมพ์ใหญ่ ตัวเลข ตัวอักขระพิเศษ รวมช่องว่าง
punct        ตัวอักขระพิเศษทุกตัว ไม่รวมตัวอักษรภาษาอังกฤษ และตัวเลข
space     ช่องว่าง (ไม่เหมือนกับ \s เลยเสียทีเดียว)
upper      ตัวอักษรภาษาอังกฤพิมพ์ใหญ่
word      กลุ่มคำตัวอักษรภาษาอังกฤษ (เหมือนกับการใช้งาน  \w)
xdigit      ตัวเลขฐานสิบหก




การกำหนดค่าตรงข้าม ใน character class จะใช้อักขระ  ^


ตัวอย่าง เช่น

รูปแบบ pattern  /[12[:^digit:]]/


- หมายถึง เป็นเลข 1 หรือ 2 หรือ ตัวอักขระทุกตัวที่ไม่ใช่ ตัวเลข 0-9 ยกเว้นเลข 1 กับ 2 ข้างต้น

ตัวอักขระภาษาไทย จะไม่สามารถใช้งานกับการกำหนด pattern ด้วย Character classes แบบ POSIX notation ในลักษณะ [[:  :]] ที่กล่าวข้างต้นได้
แต่สามารถใช้ได้ในลักษณะ การกำหนดค่าในเครื่องหมายปีกกาสี่เหลี่ยมได้ เช่น
ตัวอย่าง เช่น

รูปแบบ pattern  /[กขคง]/


- หมายถึง เป็น ตัวอักษร ก ข ค หรือ ง เป็นต้น



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







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









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











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