GORAGOD.com

Regular Expressions (ตอนที่ 1)

PHP Regular Expressions หรือเรียกสั้นๆ RegEx เป็นกลุ่มฟังก์ชั่นที่มีประโยชน์มาก ในการค้นหา หรือ แทนที่ข้อความโดยมีรูปแบบ นอกเหนือไปจาก การค้นหาข้อความธรรมดา โดยมีฟังก์ชั่นในกลุ่มนี้ ได้แก่

ereg() สำหรับค้นหาคำหรือตัวอักษรในข้อความที่ต้องการ
eregi() ค้นหาคำเช่นกัน แต่สนใจตัวอักษรภาษาอังกฤษตัวเล็กและตัวใหญ่ด้วย
ereg_replace() ค้นหาคำแล้วแทนที่ด้วยข้อความที่กำหนด
eregi_replace() ใช้เหมือนกับ ereg_replace แต่สนใจตัวอักษรภาษาอังกฤษตัวเล็กและตัวใหญ่ด้วย เช่นกัน
split() แยกข้อความออกเป็นแอเรย์ โดยคำที่กำหนด
spliti() ใช้เหมือนกับ splitแต่สนใจตัวอักษรภาษาอังกฤษตัวเล็กและตัวใหญ่ด้วย

* หมายเหตุ จะเห็นว่าชื่อฟังก์ชั่นที่มีตัว i ประกอบจะเป็นฟังก์ชั่นที่สนใจตัวอักษรภาษาอังกฤษตัวเล็กและตัวใหญ่ด้วย ( a และ A เป็นคนละตัวกัน )

ความสำคัญของฟังก์ชั่นเหล่านี้ ไม่ได้อยู่ที่ตัวฟังก์ชั่น แต่หากอยู่กับ pattern ที่ใช้ในการค้นหามากกว่า ซึ่ง pattern ก็คือรูปแบบที่ใช้ในการค้นหาข้อความตามที่กำหนดนั่นเอง ซึ่งทำให้ฟังก์ชั่นเหล่านี้แตกต่างจากฟังก์ชั่นค้นหาคำทั่วๆไป เช่น

ereg( 'test' , 'one test' ); คือการหาว่าในประโยค one test มีคำว่า test หรือไม่ ซึ่งก็คือการค้นหาข้อความธรรมดา ซึ่งถ้ามี ฟังก์ชั่นจะคืนค่า true

<?
  echo ereg( 'test' , 'one test' ); //true
  echo ereg( 'test' , 'one two' ); //false
?>

ซึ่งหากจะให้ได้ประโยชน์ของฟังก์ชั่นในกลุ่มนี้ ก็ควรจะเป็นการค้นหาข้อความด้วย pattern

<?
  echo ereg( '^one' , 'onetest' ); //true
  echo ereg( '^one'' , 'testone' ); //false
?>

ในที่นี่ '^one' คือ pattern ที่ผมกล่าวถึง ซึ่งมีความหมายว่า ประโยคที่ขึ้นต้นด้วยคำว่า one ซึ่งจะทำให้ได้เงื่อนไขแรกเท่านั้นที่เป็นจริง

ลองมาดูกันว่ามีอะไรบ้างที่เป็นคำสั่งที่ใช้ได้ใน pattern

a หรือตัวอักษรใดๆ(ตัวเลข) มีความหมายถึงตัวอักษรนั้นๆ จำนวน 1 ตัว เช่น a จะตรงกับประโยค a, aa, ba, 1a
^ นำหน้าข้อความใดๆ หมายถึง ประโยคที่ขึ้นต้นด้วยข้อความนั้นๆ ดังเช่นตัวอย่างข้างต้น นอกจากนี้หากใช้ เครื่องหมาย ^ ใน class จะหมายถึงไม่ใช่ หรือ not ด้วย
$ ต่อจากข้อความใดๆ หมายถึงประโยคที่ลงท้ายด้วยข้อความนั้นๆ เช่น test$ จะตรงกับประโยค onetest
. (จุด) ใช้แทนข้อความใดๆก็ได้ 1 คำ ยกเว้นช่องว่าง ซึ่งจะตรงกับประโยคใดๆก็ได้ แต่จะไม่ตรงกับประโยค '' (ไม่มีข้อความ) หรือ http. จะตรงกับคำว่า https แต่ ไม่ตรงกับคำว่า http (เนื่องจากไม่มีตัวอักษรใดๆต่อท้าย)
* ต่อจากตัวอักษรใดๆ หมายถึงข้อความ ที่มีตัวอักษรนั้นๆ หรือไม่มีก็ได้ เช่น ab* จะตรงกับประโยค ant แต่ไม่ตรงกับ bird เนื่องจาก ต้องมี a ส่วน b จะมีหรือไม่ก็ได้
+ ต่อจากตัวอักษรใดๆ หมายถึงข้อความ ที่มีตัวอักษรนั้นๆ อย่างน้อย 1 ตัว เช่น ab+ จะตรงกับประโยค abba แต่ไม่ตรงกับ ant
? ใช้งานเช่นเดียวกันกับ * หากต่อจากตัวอักษรใดๆ หมายถึงข้อความ ที่มีตัวอักษรนั้นๆหรือไม่มีก็ได้ เช่น ab? จะตรงกับประโยค a, ab