PHP Regular Expression (ตอนจบ)

PHP Regular Expression (ตอนจบ) ฟังก์ชันของ PHP ที่ใช้กับ Regular Expression
จากหน้าที่ผ่านมาจะมีเฉพาะตัวอย่างของ regex อาจจะทำให้เกิดความงุนงงสักหน่อยนะครับ ในส่วนนี้เราจะพูดถึงฟังก์ชันของ PHP ที่นำเอา regex ไปใช้ซึ่งได้แก่

  • ereg( ) -- regular expression match
  • ereg_replace( ) -- replace regular expression
  • eregi( ) -- case insensitive regular expression match
  • eregi_replace( ) -- replace regular expression case insensitive

ฟังก์ชันของ PHP ที่ใช้กับ Regular Expression

จากหน้าที่ผ่านมาจะมีเฉพาะตัวอย่างของ regex อาจจะทำให้เกิดความงุนงงสักหน่อยนะครับ ในส่วนนี้เราจะพูดถึงฟังก์ชันของ PHP ที่นำเอา regex ไปใช้ซึ่งได้แก่

  • ereg( ) -- regular expression match
  • ereg_replace( ) -- replace regular expression
  • eregi( ) -- case insensitive regular expression match
  • eregi_replace( ) -- replace regular expression case insensitive

ereg( ) มี syntax คือ int ereg (string pattern, string string [, array regs]) ความหมายก็คือค้นหารูปแบบ (pattern) ที่กำหนดใน string ที่ให้มา ถ้าคนพบรูปแบบที่กำหนดก็จะคืนค่า True ถ้าไม่พบหรือเกิดความผิดพลาด ก็จะคืนค่า False ตัวอย่างง่ายๆ เช่น

<?php
$text = "Hello";
if (ereg("^[0-9]", $text)) {
  echo "$text is valid.";
} else {
  echo "$text is invalid.";
}
?>

จากตัวอย่างข้างต้น ฟังก์ชัน ereg จะคืนค่า false และจะพิมพ์ประโยค Hello is invalid. ออกมา

นอกจากนี้เรายังสามารถใช้ parenthesized substring ( ) มาช่วยในการดึงข้อความย่อย (substring) ค่าออกมาจาก $string หลังจากเจอรูปแบบที่ตรงกับที่กำหนด เช่น

<?php
$date = "08-04-2002";
if (ereg("([0-9]{2})-([0-9]{2})-([0-9]{4})", $date, $regs)) {
  $date = $regs[1];
  $month = $regs[2];
  $year = $regs[3] + 543;
  echo "$date $month $year";
} else {
  echo "รูปแบบของวันที่ไม่ถูกต้องครับ!";
}
?>

จากตัวอย่างข้างบน จะได้ผลลัพธ์ คือ "08 04 2545" จะเห็นว่ามีตัวแปร $regs เพิ่มขึ้นมา (อาจจะตั้งเป็นชื่ออื่นๆ ได้) ตัวแปรนี้จะเป็นตัวแปร array ที่รับค่าต่างๆ จาก ( ) (parenthesized substring) โดยจะมีรูปแบบดังนี้

  • $regs[0] จะมีค่าเท่ากับข้อความเดิมทั้งหมด ในตัวอย่างนี้ก็คือ "08-04-2002"
  • $regs[1] จะมีค่าเท่ากับข้อความย่อยในวงเล็บเปิดที่อยู่อันแรกซ้ายมือสุด คือ "08"
  • $regs[2] จะมีค่าเท่ากับข้อความย่อยในวงเล็บเปิดที่ถัดมาจากอันแรก คือ "04"
  • $regs[3] จะมีค่าเท่ากับข้อความย่อยในวงเล็บเปิดที่ถัดมาจากอันที่สอง คือ "2002"

และถ้าหากมีวงเล็บอันที่สี่ซ้อน เพิ่มขึ้นมาอีกก็จะมีค่าเป็น $regs[4] เป็นเช่นนี้ต่อไปจนถึง $regs[9] ครับ รวมแล้วก็มีทั้งหมด 10 ตัวครับ

ตัวอย่างการดึงตัวเลข 4 ตัวที่ติดกันออกมาจากข้อความ

<?
$user_text = @$_POST["user_text"];
if (isset($user_text)) {
  $user_text = htmlspecialchars(quotemeta($user_text));
  echo "<b>ข้อความของคุณคือ</b>: $user_text<br>";
  if (ereg("[0-9][0-9][0-9][0-9]", $user_text, $regs)) {
    echo "<b>ตัวเลขติดกัน 4 ตัวแรกที่พบคือ</b>: $regs[0]<br>";
  } else {
    echo "ไม่พบตัวเลขติดกัน 4 ตัวตามรูปแบบที่กำหนด<br>";
  }
}
?>

ตัวอย่างการตรวจสอบความถูกต้องของ email

<?
function check_email($input_email) {
 if( eregi( "^" .
   "[a-z0-9]+([_\\\\.-][a-z0-9]+)*" . //user
   "@" .
   "([a-z0-9]+([\\.-][a-z0-9]+)*)+" . //domain
   "\\\\.[a-z]{2,}" . //sld, tld
   "$", $input_email, $regs)
  ) { return TRUE; } else { return FALSE; }
 }
 if (isset($_POST["user_email"])) {
  $user_email = $_POST["user_email"];
  echo "<b>Email ที่คุณป้อนมาคือ</b>: $user_email<br>";
  if (check_email($user_email)) {
   echo "<b>Email ที่คุณป้อนมีรูปแบบถูกต้องแล้วครับ</b>";
  } else {
   echo "<b>Email ที่คุณป้อนมีรูปแบบไม่ถูกต้องครับ</b>";
 }
}
?>