[PHP] Regular Expression (Regex)

วันนี้มาพูดกันถึงเรื่อง Regular Expression ต่อไปขอเรียกว่า Regex แล้วกันนะครับ ทำไมถึงมาสอนเรื่องนี้ เพราะว่าคนที่จะเขียนโปรแกรมจะต้องรู้จัก เจ้าตัวนี้ไว้เปรียบเสมือนพื้นฐานของโปรแกรมเมอร์  เพราะอะไรน่ะหรอ ? เวลาที่โปรแกรมเมอร์ต้องการตรวจจับ รูปแบบ ( pattern ) ของประโยคต่างๆได้ เอาล่ะเราไปดูกันเลยว่าทำอย่างไรบ้าง

เริ่มต้นกับ Regex

ในที่นี้ผมจะทดลองแบบ PHP นะครับและอย่างที่กล่าวไปแล้วคุณต้องเรียนรู้ตรงจุดนี้เพราะว่ามันมีประโยชน์เกี่ยวกับการตรวจสอบข้อมูล เช่น คุณต้องการจะตรวจสอบว่า User ใส่กรอกข้อมูลเป็นตัวเลขอย่างเดียวหรือเปล่า หรือว่าต้องการที่ใส่ pattern ที่คุณต้องการเช่นให้กรอก 08 ก่อนทำนองนี้ เอาล่ะ ! ร่ายยาวมาถึงนี่แล้วคุณคงเบื่อผมว่าเราไปเจอของจริงกันดีกว่าครับเอาแบบพื้นๆเบๆ ( เบสิก ) กันก่อนเลย

<?php
$string = 'Hello World. This is an example one for Regex.';
$pattern = '#Regex#';
$match = '';
preg_match($pattern, $string , $match);
print_r($match);
//output: Array ( [0] => Regex )
?>

จะเห็นว่าในตัวแปล $pattern นั้นผมใช้ ‘#’ ในการเปิดปิด pattern ซึ่งถ้าคุณเคยเห็นหรือเคยอ่านเกี่ยวกับ Regex มาบ้างจะเห็นคนส่วนใหญ่ใช้ ‘/ ( slash )’ กันเยอะซึ่งผมคิดว่ามันแล้วแต่คนที่จะใช้อะไร เพราะว่าถ้าคุณใช้ ‘/’ ในการเปิดปิด เดี๋ยวจะกล่าวถึงในหัวข้อของการใช้ ‘\’ ( back slash ) อีกทีหนึ่งครับ

[ ]

การใช้ function ของ PHP นั้นจะมีใช้กันบ่อยๆก็จะเป็น preg_match , preg_match_all , preg_replace ซึ่งจะค่อยๆไปกันทีละ step อย่าใจร้อนนะ … เอ๊ะ ! บอกอย่าใจร้อนไง ( ฮา ) โอเคไปกันต่อ สมมติว่าถ้าเราต้องหาอะไรที่มัน Advance อีกนิด โดยเราอยากหาเป็นค่าช่วงระหว่างหรือว่าเป็นแบบเป็น a หรือ b แต่อาจจะไม่ดีนะสำหรับการใช้ หรือผมจะแนะนำอีกตัวให้ดูแล้วกัน ดูตัวอย่างด้านล่างครับ

<?php
$string = 'Hello World. Hey ! I just meet you';
$pattern = '#He[l-y]#';
$match = '';
preg_match($pattern, $string , $match);
print_r($match);
// output: Array('0' => 'Hel');
?>

อ้าวทำไมเป็นอย่างนี้ล่ะ บอกว่าเป็นหรือแล้วใส่ [ly] มันก็น่าจะจับมา 2 ตัวคือ Hel หรือ Hey แต่ทำไมคำตอบถึงออกมาเป็นแค่ Hel อันเดียวแล้วถ้าเราจะให้จับมาทั้งสองตัวจะทำอย่างไร มันจึงเกิด function preg_match_all ยังไงล่ะครับ คราวนี้เราก็จะสามารถเอา ‘ทุกตัว’ ที่ตรงกับที่เราต้องการได้แล้ว จากตัวอย่างที่แล้วถ้าคุณลองเปลี่ยน function preg_match เป็น preg_match_all ก็จะได้แล้วครับ

นอกจากใช้เป็น เงื่อนไขรูปแบบ ‘หรือ’ แบบง่ายๆแล้วยังใช้เป็นช่วงระหว่างได้ เช่นเราต้องการ ให้ User กรอกข้อมูลที่เป็นตัวเลข  เท่านั้นถ้า User ใส่ข้อมูลอะไรที่มีตัวเลข ก็จะตรวจเจอ

$string = 'Hello World. Hey ! I just meet you. Today is 30/6/2555';
 
$pattern = '#[0-9]#';
 
$match = '';
 
preg_match_all($pattern, $string , $match);
 
print_r($match);

จะเห็นว่าเราจะได้ชุดตัวเลขทุกตัวซึ่งในความเป็นจริงเราก็ไม่ได้อยากได้เยอะขนาดนี้ บางทีเราอาจจะอยากได้ ‘ตัวเลขที่มี 2 ตัวขึ้นไป’ เราจะต้องใช้อีกเครื่องมือหนึ่งมาเข้ามาช่วยนั่นก็คือ

{n,m}

  • n คือ ค่าที่น้อยที่สุดที่ต้องการ
  • m คือ ค่าที่มากที่สุดที่ต้องการ

ถ้าคุณไม่ใช่ค่า m มันจะเหมือนกับเขียนในรูปแบบนี้ { n , } มันแปลว่าเอาค่าที่ต่ำสุด n และมากขึ้นไปเท่าไรก็ได้ แต่ถ้าหากเราใส่แค่ว่า { n } อย่างนี้จะเป็นการบอกว่าเอาแค่ทีละ 2 ตัวเท่านั้นไม่มีน้อยหรือมากไปกว่านี้ เพื่อความเข้าใจเรามาดูตัวอย่างกันเลยดีกว่า

$string = 'Hello World. Hey ! I just meet you. Today is 30/6/2555';
 
$pattern = '#[0-9]{2}#';
$pattern1 = '#[0-9]{2,}#';
 
$match = '';
 
preg_match_all($pattern, $string , $match);
preg_match_all($pattern1, $string , $match1);
 
print_r($match);
//output : Array ( [0] => Array ( [0] => 30 [1] => 25 [2] => 55 ) ) 
 
print_r($match1);
//output : Array ( [0] => Array ( [0] => 30 [1] => 2555 ) )

ในตัวแปร $match เราจะได้ตัวเลขที่ เป็น 2 ตัวเท่านั้น แต่อีกตัวอย่างที่เราเพิ่มขึ้นนั้นจะได้ชุดตัวเลข เลยที่ เป็นจำนวน 2 ตัวขึ้นไป ดังจะเห็นได้จากโค้ดแล้วตัวอย่างนี้มีประโยชน์อย่างไร มีประโยชน์เช่น เมื่อคุณต้องการให้ User กรอกตัวเลขเบอร์โทรศัพท์คุณก็สามารถกำหนดได้ว่าให้กรอกเท่าไร กี่ตัว เป็นตัวเลขหรือว่าตัวอักษรด้วยหรือไม่

สรุป

ตอนแรกว่าจะเขียนทีเดียวจบแต่คิดว่ารายละเอียดเยอะและเป็นประโยชน์ ผมจึงคิดว่าคงต้องเขียนเป็นภาคต่อไปอีกแน่นอน คงต้องรอติดตามครับ ส่วนในเนื้อหาครั้งนี้ถ้าคุณลองอ่านแล้วไม่เข้าใจหรือมีตัวอย่างที่อยากลองทำ ลองมาแบ่งปันดูครับ ความคิดเห็นของคุณเป็นสิ่งสำคัญของเนื้อหาเช่นกัน ไว้เจอกันภาคต่อไปครับ สวัสดี.

คุณอาจจะสนใจเรื่องเหล่านี้ :

  • กลับมาพบกันอีกแล้วสำหรับเรื่อง Regex ในภาคที่สอง สอง สอง สอง สองงงงงงง ใครยังไม่ได้อ่านภาคแรกกลั ...

  • Hi, this problem I have found when I updated jetpack. I see many people get this warning Warn ...

  • วันนี้จะว่ากันถึงเรื่องตกม้าตายเรื่องหนึ่งในการทำงานของผมตอนที่เขียนโค้ด Pantip3G โดยมีปัญหาด้าน ...

  • Login by Ajax จากคราวที่แล้วผมได้เปิดเรื่องเกี่ยวกับการใช้ Ajax เบื้องต้นโดยเริ่มจากการ H ...

  • อาจจะเรียกว่าเว็บโปรแกรมเมอร์สมัยนี้ไม่อาจจะหลีกเลี่ยงได้เลยกับการใช้ Ajax เพราะว่ามันตอบสนองได้ ...