แสดงบทความที่มีป้ายกำกับ Regular Expression แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ Regular Expression แสดงบทความทั้งหมด

08 ตุลาคม 2552

PHP Regular Expression Function

ฟังก์ชันของ PHP ที่ใช้กับ Regular Expression
จากที่ผ่านมาเราได้ให้ความรู้เกี่ยวกับ Meta characters ไปแล้ว ในส่วนนี้เราจะพูดถึงฟังก์ชันของ PHP ที่นำเอา regex ไปใช้ซึ่งได้แก่
ฟังก์ัชั่นแบบ Perl Compatible Regular Expression (PCRE) กับ POSIX Extended Regular Expression


Perl compatible Regular Expression (PREC) ประกอบด้วย
  • preg_grep
  • preg_last_error
  • preg_match_all
  • preg_match
  • preg_quote
  • preg_replace_callback
  • preg_replace
  • preg_split
การระบุ patthen ใน Perl Compatible Regular Expression (PCRE) นั้นจะต้อง อยู่ภายใต้ /.../ เท่านั้น

POSIX Extended Regular Expression ประกอบด้วย
  • ereg_replace
  • ereg
  • eregi_replace
  • eregi
  • split
  • spliti
  • sql_regcase
จากฟังก์ชั่นที่กล่าวมาทั้งหมด มักมีการใช้งานกันไม่กี่ฟังก์ชั่น โดยจะขอยกตัวอย่างฟังก์ชั่นที่มีการใช้งาน บ่อย ๆ เช่น preg_match, preg_replace, ereg, ereg_replace
preg_match() ใช้สำหรับค้นหาข้อความ เปรียบเทียบข้อความกับ patthen โดยมี syntax คือ int preg_match (
string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] ) ตัวอย่างเช่น
<?php
$string = "http://docs.google.com/View?id=dvn0000_5ddbv0000";
if (preg_match('/^http:\/\/docs.google.com\/View\?id=([a-z0-9]{7})+_+([a-z0-9]{9})+$/', $string ))
{
echo "$string is Google Docs URL";
}
else
{
echo "$string is't Google Docs URL";
}

?>
ผลลัพธ์ที่ได้ก็จะเป็น http://docs.google.com/View?id=dvn0000_5ddbv0000 is Google Docs URL

ตัวอย่างการนำเอาข้อความที่ค้นหาเจอมาใช้งาน
<?php

$string = "YOUR IP IS 127.0.0.1";
if (preg_match('/(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])/', $string, $match ))
{
echo $match[0];

}
else
{
echo "$string is't have IP Address";
}

?>

ผลลัพธ์ ที่ได้คือ 127.0.0.1

preg_replace() ใช้สำหรับค้นหาและแทนที่ข้อความ มี syntax คือ mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit=
-1 [, int &$count ]] ) preg_replace สามารถใช้ patthen ในรูปแบบของ array ได้ นั่นก็หมายถึง สามารถแทนที่ข้อความหลาย ๆ แบบ ด้วย ข้อความ หลาย ๆ แบบ ตัวอย่างเช่น

<?php
$patthen = array('/ll/', '/or/');
$strreplace = array('--', '--');

$string = "Hello World";
echo preg_replace($patthen, $strreplace, $string);
?>

ผลลัพธ์ที่ได้คือ He--o w--ld

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


<?php
$text = "Hello";
if (ereg("^[a-z]", $text)) {
echo "$text is Match.";
} else {
echo "$text is Not Match.";
}
?>


ผลลัพท์ทีได้จากการ ทำงานของฟังก์ชั่นข้างบนคือ จะพิมพ์ประโยค Hello is Match. ออกมาก

การนำเอาคำที่ค้นหาเจอไปใช้งาน สามารถทำไ้ด้ เช่น


<?php
$date = "01-01-2009";
if (ereg("([0-9]{2})-([0-9]{2})-([0-9]{4})", $date, $regs)) {
$year = $regs[3];
echo "this year is : $year";
} else {
echo "Date Format is Not Match !";
}
?>


จากตัวอย่างข้างบน จะได้ผลลัพธ์ คือ this year is : 2009 จะเห็นว่าเราได้เพิ่ม $regs เข้ามารับค่าของ array ที่เปรียบเทียบแล้วตรงกับ patthen ค่าที่มีอยู่ใน $regs จะเรียงตามกลุ่มของ patthen ที่เราระบุไว้ โดยจะมีข้อมูลอยู่ภายใน array ดังนี้
$regs[0] = "01-01-2009"
$regs[1] = "01"
$regs[2] = "01"

$regs[3] ="2009"

ereg_replace () ใช้่สำหรับค้นหาและแทนที่คำ ใน ข้อความ โดยใช้ patthen เป็นตัวระบุรูปแบบของข้อความ มี syntax คือ string ereg_replace
( string $pattern , string $replacement , string $string ) ถ้าทำการค้นหาเปรียบเทียบคำพบแล้ว ก็จะแทนที่ด้วยคำที่ระบุเข้าไปใน $replacement ตัวอย่างเช่น
<?php

$string = "Hello world";
echo ereg_replace("world", "sutee", $string);
// ผลลัพธ์ ที่ได้ออกมาคือ Hello sutee

?>

01 ตุลาคม 2552

Regular Expressions Metacharacter

Regular Expressions หรือ regex เป็น เครื่องมือที่มีประโยชน์มากในการเปรียบเทียบตัวอักษร คำ หรือ รูปแบบของข้อความต่างๆ ที่เราต้องการจากข้อความอื่นๆ เมื่อค้นหาได้แล้วเราก็อาจจะแทนที่ด้วยข้อความอื่นๆ ได้

การใช้ regex ไม่ได้มีเฉพาะใน PHP นะครับ อย่างใน Javascript, Perl, VBscript แม้กระทั่งใน MySQL ก็มีเช่นกันครับ

ถ้าคุณต้องการจะใช้ regex ละก็คงหนีไม่พ้นที่จะต้องทำความรู้จักกับ Meta characters เพราะนอกจากเราจะใช้ตัวอักษรและตัวเลขต่างๆ ในการสร้างรูปแบบ (pattern) ของตัวอักษรที่เราต้องการจะค้นหาแล้ว เราสามารถใช้ Meta characters มาช่วยสร้างรูปแบบอื่นๆ ที่มีความซับซ้อนมากขึ้นได้

Meta characters

  • \ ใช้เป็น escape character
  • ^ ใช้สำหรับกำหนด ตำแหน่งเริ่มต้นของข้อความ เช่น "^PHP" จะตรงกับข้อความที่จะต้องขึ้นต้นด้วย PHP เท่านั้น
  • $ ใช้สำหรับกำหนด ตำแหน่งสิ้นสุด เช่น "PHP$" จะตรงกับข้อความที่จะต้องลงท้า่ยด้วย PHP เท่านั้น
  • . ใช้สำหรับแทนตัวอักษรใด ๆ 1 ตัวอักษร เช่น "P.P" จะตรงกับ "PHP" แต่จะไม่้ตรงกับ "PHHP" เนื่องจากต้องการตัวอักษรตัวใดก็ได้ที่อยู่ตรงกลาง
  • [ เริ่มต้นการกำหนดระดับอักษรที่เป็นไปได้ในเงื่อนไข
  • ] สิ้นสุดการกำหนดระดับอักษร
  • | เป็นสัญลักษณ์ที่สำหรับเป็นทางเลือก
  • ( ใช้สำหรับเริ่มจัดกลุ่มตัวอักษร
  • ) ใช้สำหรับสิ้นสุดการจัดกลุ่มตัวอักษร
  • ? แทนตัวอักษร แต่จะสามารถปรากฎ หรือไม่ปรากฎก็ได้ 1 ครั้ง
  • * แืทนตัวอักษร แต่จะสามารถปรากฎ หรือไม่ปรากฎ ได้หลาย ๆ ครั้ง เช่น "wh*" จะตรงกับ "w" และ "where"
  • + แทนตัวอักษร ที่จะต้องปรากฎ 1 ครั้ง หรือปรากฎได้หลายครั้ง เช่น "wh+" จะตรงกับ "where" แต่จะตรงกบ "w"
  • { เริ่มตรวจสอบจำนวนตัวอักษร
  • } สิ้นสุดการตรวจสอบตัวอักษร
  • - ใช้สำหรับระบุช่้วงตัวอักษร ต้องใช้ภายใต้ [] เท่านั้น

การใช้งาน [ และ ]

การ ใช้งาน [ และ ] เป็นการตรวจสอบระดับตัวอักษรที่เป็นไปได้ในเงื่อนไข จะสามารถตรวจสอบได้เพียง 1 ตัวอักษร ตัวอย่าง "[abcde]" จะตรงกับ "a" แต่จะไม่ตรงกับ "f" และ "g"

การใช้งาน { และ }

เราสามารถระบุจำนวนของตัวอักษร การใช้งานของ { } สามารถใช้ได้ 3 แบบ คือ
  • {n} n แทนตัวเลขที่ปรากฎได้ หมายถึงต้องมีตัวอักษรปรากฎเท่ากับจำนวนตัวเลขที่ระบุอยู่ เช่น "{3}" จะต้องมี ตัวอักษรหรือตัวเลขปรากฎ 3 ตัวอักษร ซึ่งจะตรงกับ "are" แต่จะไม่ตรงกับ "were"
  • {n,} n แทนตัวเลขที่ปรากฎได้ หมยถึง ต้องมีตัวอักษรปรากฎอยู่ มากกว่าหรือเท่ากับ จำนวนตัวเลขที่ระบุอยู่ เช่น "{3,}" จะต้องมี อักษรปรากฎอยู่อย่างน้อย 3 ตัวอักษร ซึ่งจะตรงกับ "are" และ "were" แต่จะไม่ตรงกับ "do"
  • {n,m} n แทนตัวเลขที่ปรากฎได้ m แทนตัวเลขที่ปรากฎได้สูงสุด หมายถึง ต้องมีตัวอักษรปรากฏอยู่อย่างน้อน n ตัว แต่ต้องไม่เกิน m ตัว เช่น "{3,5}" ซึ่งจะตรงกับ "are" และ "where" แต่จะไม่ตรงกับ "do"

การใช้งาน [] ร่วมกัีบ {}

การนำเอา "[]" มาใช้งานร่วมกับ "{}" ก็จะทำให้ "[]" ที่ตรวจสอบตัวอักษรได้แต่ 1 ตัวอักษร ก็ทำให้สามารถตรวจสอบ ได้หลาย ตัวอักษร เราสามารถใช้ "-" เช่น "[a-z]{3}" จะตรงกับ "who" และ "are" ซึ่งตรงตามเงื่อนไขก็คือ สามารถมี a - z แต่ต้องมีขนาด 3 ตัวอักษร แต่จะไม่ตรงกับ "2bb" เนื่องจากมี ตัวเลขปรากฎอยู่

การใช้ () และ |

เราสามารถใช้ () จัดกลุ่มข้อความที่มีอยู่ และ | ใช้สำหรับเลือกทางเลือก เช่น "a(b|c)" จะตรงกับ "ab" และ "ac" แต่จะไม่ตรงกับ "bc" ลองดูตัวอย่างที่มีการทำงานซับซ้อนมากขึ้นอีกนะครับ "^[a-z]+[a-z]$" ความหมายคือ ต้องขึ้นต้นด้วยตัวอักษร และ ลงท้ายด้วยตัวอักษร อย่างน้อย 1 ตัว "^[a-z\-]" ความหมายคือ ต้องขึ้นต้นด้วยตัวอักษร หรือ "-" ตัวอย่างของ Regex ที่มีใช้บ่อย ๆ "^[a-z0-9_\-]+(\.[_a-z0-9\-]+)*@([_a-z0-9\-]+\.)+([a-z]{2}|aero|arpa|biz|com|coop|edu|gov|info|int|jobs|mil|museum|name|nato|net|org|pro|travel)$" ใช้สำหรับตรวจสอบ email "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$" ใช้สำหรับตรวจสอบ IP Address
 

sutee-developer Copyright © 2009 Community is Designed by Bie