StepCoding

Character Classes

อ่าน [1740] หมวดหมู่: Regular Expression

Character class เป็นการระบุชุดของอักขระที่ให้มันยอมรับได้ (หรือพูดง่าย ๆ ก็คือการกำหนดอักขระที่เป็นไปได้ไว้หลาย ๆ ทางเลือก) ใน pattern ของเรา เราสามารถสร้างได้ทั้ง character class ของเราเอง หรือกำหนดเฉพาะเจาะจงได้ ซึ่งในการสร้าง character class นั้นจะต้องอยู่ภายใน [] เท่านั้น

<?php
$bool = ereg('c[aeiou]t', 'I cut my hand');
// true เนื่องจากว่าในข้อความนี้มีอักขระ c_t โดยที่ระหว่าง c กับ t นั้นเป็นตัว u ซึ่งมันอยู่ใน character class ที่เรากำหนดไว้

$bool = ereg('c[aeiou]t', 'This crusty cat');
// true ถึงแม้ว่า crusty นั้นจะไม่ถูกตามรูปแบบที่กำหนด แต่ว่า cat ก็ยัง match กับรูปแบบที่กำหนดเพราะว่า a อยู่ในชุดของ character class

$bool = ereg('c[aeiou]t', 'What cart?');
// false เพราะว่า มันตรวจสอบไม่พบคำว่า cat, cet, cit, cot, cut ใด ๆ เลย แต่ข้อความที่กำหนดไปเป็น cart ดังนั้น car จะไม่ match กับรูปแบบ regular expression นี้

$bool = ereg('c[aeiou]t', '14ct gold');
// false จะเห็นว่ามี ct อยู่ในข้อความ แต่มันอยู่ติดกัน จึงไม่ match กับ regular expression แน่นอน
?>

ในทางกลับกันเราสามารถกำหนดกลุ่มของ character class ที่ไม่ต้องการได้ โดยใช้อักขระ caret (^) ภายใน [] เช่น

<?php
$bool = ereg('c[^aeiou]t', 'I cut my hand');
// false เนื่องจากว่า character class กำหนดว่าระหว่าง c_t จะต้องไม่มีอักขระ a, e, i, o, u ซึ่งในข้อความนั้น ๆ จะเห็นว่ามี u อยู่ระหว่าง c_t ดังนั้นมันจึงไม่ match กับรูปแบบที่กำหนด

$bool = ereg('c[^aeiou]t', 'Reboot chthon');
// true เนื่องจากว่าระหว่าง c_t เป็นตัวอักษร h ซึ่งไม่ได้ถูกห้ามไว้ใน character class

$bool = ereg('c[^aeiou]t', '14ct gold');
// false ถึงแม้ว่าเรากำหนดไว้ว่าเป็นอะไรก็ได้ที่ไม่อยู่อักขระ a, e, i, o, u ก็ตาม แต่ก็ไม่ได้หมายถึงจะไม่มีอักขระระหว่าง c_t เลย ดังนั้นในข้อความนี้จะเห็นว่ามี ct อยู่ติดกันจึงไม่ match กับรูปแบบนี้
?>

เราสามารถกำหนด range ของ character ได้โดยการใช้สัญลักษณ์ (-) ซึ่งจะทำให้ง่ายในการกำหนด character class ของตัวอักษรทั้งหมด หรือตัวเลขทั้งหมดนั่นเอง

<?php
$bool = ereg('[0-9]%', 'We are 25% complete');
// true เนื่องจากใน character class กำหนดว่าต้องมีตัวเลขตั้งแต่ 0-9 นำหน้า % จำนวนหนึ่งตัว

$bool = ereg('[0123456790]%', 'We are 25% complete');
// true ความหมายเช่นเดียวกัน เพียงแต่ไม่ได้กำหนดเป็น range

$bool = ereg('[a-z]t', '11th');
// false เพราะว่าในข้อความนั้น ๆ ก่อนตัว t จะเป็นตัวเลขไม่ใช่อักษรภาษาอังกฤษ a-z ใด ๆ

$bool = ereg('[a-z]t', 'cat');
// true เพราะว่าข้างหน้าตัว t เป็นตัวอักษร a-t

$bool = ereg('[a-z]t', 'PIT');
// false เนื่องจาก case ไม่เหมือนกัน (case-sensitive)

$bool = ereg('[a-zA-Z]!', '11!');
// false เนื่องจากข้างหน้าสัญลักษณ์ "!" ในข้อความนั้น ๆ เป็นตัวเลข แต่ใน regular expression นั้นกำหนดว่าข้างหน้า ! เป็นได้เฉพาะ a-z หรือ A-Z เท่านั้น

$bool = ereg('[a-zA-Z]!', 'stop!');
// true เนื่องจากข้างหน้าสัญลักษณ์ "!" ในข้อความนั้น ๆ เป็นตัวอักษรที่อยู่ในช่วง a-z หรือ A-Z
?>

ผู้สนับสนุน