본문으로 건너뛰기

เนื้อหาภาษาไทย / 태국어 콘텐츠

시스템 가이드 검수 완료된 콘텐츠

Working with Regular Expressions (Regex)

บทความนี้แนะนำ Regular Expressions (Regex) ใน PHP ซึ่งเป็นเครื่องมือสำหรับค้นหา, จับคู่, และจัดการข้อความตามรูปแบบที่กำหนด โดยอธิบายถึง metacharacters, quantifi...

Working with Regular Expressions (Regex)

Regular Expressions หรือ Regex คือเครื่องมืออันทรงพลังสำหรับการค้นหา, จับคู่, และจัดการข้อความตามรูปแบบ (pattern) ที่กำหนดไว้ ใน PHP, Regex ถูกใช้งานอย่างแพร่หลายในการตรวจสอบความถูกต้องของข้อมูล (validation), การค้นหาและแทนที่ข้อความ, และการแยกข้อมูลจาก string ขนาดใหญ่ บทความนี้จะพาคุณไปรู้จักกับพื้นฐานของ Regex ที่จำเป็นสำหรับการใช้งานใน PHP

Regular Expressions คืออะไร?

Regex คือลำดับของอักขระที่สร้างรูปแบบการค้นหา (search pattern) รูปแบบนี้ถูกนำไปใช้เพื่อค้นหา, จับคู่, และจัดการข้อความใน string หนึ่ง Regex ไม่ใช่ภาษาโปรแกรมมิ่ง แต่เป็นชุดของ syntax และ rules ที่ใช้ในการ define pattern

Metacharacters

Metacharacters คืออักขระพิเศษที่มีความหมายเฉพาะในโลกของ Regex อักขระเหล่านี้ช่วยให้เราสร้าง pattern ที่มีความยืดหยุ่นและสามารถจับคู่กับข้อความที่หลากหลายได้

  • . (Dot): จับคู่อักขระใดๆ ก็ได้ ยกเว้น newline character (\n)
  • ^ (Caret): จับคู่จุดเริ่มต้นของ string หรือบรรทัด
  • $ (Dollar): จับคู่จุดสิ้นสุดของ string หรือบรรทัด
  • \ (Backslash): ใช้ escape อักขระพิเศษ เพื่อให้ตีความเป็น literal character
  • | (Pipe): ใช้เป็น OR operator เพื่อจับคู่ pattern ใด pattern หนึ่ง
  • [] (Square Brackets): ใช้ define character class (set of characters) ที่ต้องการจับคู่
  • () (Parentheses): ใช้ grouping เพื่อสร้าง subpatterns

ตัวอย่าง:

<?php

$string = "The quick brown fox jumps over the lazy dog.";

// จับคู่อักขระใดๆ ที่ตามด้วย "quick"
if (preg_match('/.quick/', $string)) {
  echo "Found '.quick'\n"; // Output: Found '.quick'
}

// จับคู่ string ที่เริ่มต้นด้วย "The"
if (preg_match('/^The/', $string)) {
  echo "String starts with 'The'\n"; // Output: String starts with 'The'
}

// จับคู่ string ที่ลงท้ายด้วย "dog."
if (preg_match('/dog.$/', $string)) {
  echo "String ends with 'dog.'\n"; // Output: String ends with 'dog.'
}

// จับคู่ "quick" หรือ "lazy"
if (preg_match('/quick|lazy/', $string)) {
  echo "Found 'quick' or 'lazy'\n"; // Output: Found 'quick' or 'lazy'
}

// จับคู่อักขระที่เป็น a, b, c, d, หรือ e
if (preg_match('/[abcde]/', $string)) {
  echo "Found a, b, c, d, or e\n"; // Output: Found a, b, c, d, or e
}

?>

Quantifiers

Quantifiers ใช้ระบุจำนวนครั้งที่ pattern ควรจะปรากฏขึ้น

  • * (Asterisk): จับคู่ 0 ครั้งขึ้นไป
  • + (Plus): จับคู่ 1 ครั้งขึ้นไป
  • ? (Question Mark): จับคู่ 0 หรือ 1 ครั้ง
  • {n} (Curly Braces): จับคู่ n ครั้ง
  • {n,} (Curly Braces): จับคู่ n ครั้งขึ้นไป
  • {n,m} (Curly Braces): จับคู่ระหว่าง n ถึง m ครั้ง

ตัวอย่าง:

<?php

$string = "abbcccddddeeeee";

// จับคู่ "b" ที่ปรากฏ 0 ครั้งขึ้นไป
if (preg_match('/b*/', $string)) {
  echo "Found 'b*' (0 or more times)\n"; // Output: Found 'b*' (0 or more times)
}

// จับคู่ "b" ที่ปรากฏ 1 ครั้งขึ้นไป
if (preg_match('/b+/', $string)) {
  echo "Found 'b+' (1 or more times)\n"; // Output: Found 'b+' (1 or more times)
}

// จับคู่ "c" ที่ปรากฏ 0 หรือ 1 ครั้ง
if (preg_match('/c?/', $string)) {
  echo "Found 'c?' (0 or 1 time)\n"; // Output: Found 'c?' (0 or 1 time)
}

// จับคู่ "d" ที่ปรากฏ 4 ครั้ง
if (preg_match('/d{4}/', $string)) {
  echo "Found 'd{4}' (exactly 4 times)\n"; // Output: Found 'd{4}' (exactly 4 times)
}

// จับคู่ "e" ที่ปรากฏ 3 ครั้งขึ้นไป
if (preg_match('/e{3,}/', $string)) {
  echo "Found 'e{3,}' (3 or more times)\n"; // Output: Found 'e{3,}' (3 or more times)
}

// จับคู่ "c" ที่ปรากฏระหว่าง 1 ถึง 3 ครั้ง
if (preg_match('/c{1,3}/', $string)) {
  echo "Found 'c{1,3}' (between 1 and 3 times)\n"; // Output: Found 'c{1,3}' (between 1 and 3 times)
}

?>

Character Classes

Character classes เป็นชุดของอักขระที่ใช้แทนกลุ่มของอักขระที่ต้องการจับคู่

  • [abc]: จับคู่อักขระ a, b, หรือ c
  • [^abc]: จับคู่อักขระใดๆ ที่ไม่ใช่ a, b, หรือ c
  • [a-z]: จับคู่อักขระใดๆ ที่เป็นตัวอักษรพิมพ์เล็ก a ถึง z
  • [A-Z]: จับคู่อักขระใดๆ ที่เป็นตัวอักษรพิมพ์ใหญ่ A ถึง Z
  • [0-9]: จับคู่อักขระใดๆ ที่เป็นตัวเลข 0 ถึง 9
  • \d: จับคู่อักขระใดๆ ที่เป็นตัวเลข (เทียบเท่ากับ [0-9])
  • \D: จับคู่อักขระใดๆ ที่ไม่ใช่ตัวเลข (เทียบเท่ากับ [^0-9])
  • \w: จับคู่อักขระใดๆ ที่เป็น word character (ตัวอักษร, ตัวเลข, และ underscore) (เทียบเท่ากับ [a-zA-Z0-9_])
  • \W: จับคู่อักขระใดๆ ที่ไม่ใช่ word character (เทียบเท่ากับ [^a-zA-Z0-9_])
  • \s: จับคู่อักขระใดๆ ที่เป็น whitespace (space, tab, newline)
  • \S: จับคู่อักขระใดๆ ที่ไม่ใช่ whitespace

ตัวอย่าง:

<?php

$string = "Hello World 123!";

// จับคู่อักขระที่เป็นตัวอักษรพิมพ์ใหญ่
if (preg_match('/[A-Z]/', $string)) {
  echo "Found uppercase letter\n"; // Output: Found uppercase letter
}

// จับคู่อักขระที่เป็นตัวเลข
if (preg_match('/\d/', $string)) {
  echo "Found a digit\n"; // Output: Found a digit
}

// จับคู่อักขระที่เป็น whitespace
if (preg_match('/\s/', $string)) {
  echo "Found whitespace\n"; // Output: Found whitespace
}

// จับคู่อักขระที่เป็น word character
if (preg_match('/\w/', $string)) {
  echo "Found a word character\n"; // Output: Found a word character
}

?>

PHP Functions สำหรับ Regular Expressions

PHP มีฟังก์ชันหลายตัวที่รองรับการทำงานกับ Regular Expressions ฟังก์ชันที่พบบ่อยที่สุดคือ:

  • preg_match(): ตรวจสอบว่า string ตรงกับ pattern หรือไม่ คืนค่า 1 ถ้าตรง, 0 ถ้าไม่ตรง, และ false หากเกิดข้อผิดพลาด
  • preg_match_all(): ค้นหา pattern ทั้งหมดใน string และเก็บผลลัพธ์ไว้ใน array
  • preg_replace(): แทนที่ pattern ที่พบใน string ด้วย string อื่น
  • preg_split(): แยก string ออกเป็น array โดยใช้ pattern เป็น delimiter

ตัวอย่างการใช้งาน preg_match():

<?php

$email = "test@example.com";

// ตรวจสอบว่า email address ถูกต้องตามรูปแบบหรือไม่
if (preg_match('/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', $email)) {
  echo "Valid email address\n"; // Output: Valid email address
} else {
  echo "Invalid email address\n";
}

?>

ตัวอย่างการใช้งาน preg_replace():

<?php

$string = "Hello World!";

// แทนที่ "World" ด้วย "PHP"
$newString = preg_replace('/World/', 'PHP', $string);

echo $newString . "\n"; // Output: Hello PHP!

?>

Trade-offs และแนวปฏิบัติที่ดี

แม้ว่า Regex จะมีประโยชน์อย่างมาก แต่ก็มีข้อควรระวัง:

  • Performance: Regex ที่ซับซ้อนอาจทำให้ performance ลดลง ควรพิจารณาความซับซ้อนของ pattern ให้เหมาะสมกับงาน
  • Readability: Regex ที่ยาวและซับซ้อนอาจอ่านและทำความเข้าใจยาก ควรเขียนให้กระชับและใช้ comments อธิบาย
  • Security: ระวัง Regex Denial of Service (ReDoS) attacks ที่ผู้ไม่หวังดีอาจใช้ Regex ที่ทำให้ server ทำงานหนักเกินไป

แนวปฏิบัติที่ดี:

  • เริ่มต้นด้วย pattern ที่ง่ายที่สุดเท่าที่จะเป็นไปได้ และค่อยๆ เพิ่มความซับซ้อน
  • ใช้ online Regex testers เพื่อทดสอบ pattern ก่อนนำไปใช้จริง
  • เขียน comments อธิบาย pattern ที่ซับซ้อน
  • พิจารณาใช้ alternative solutions ถ้า Regex ทำให้ code อ่านยากเกินไป หรือ performance ต่ำ

สรุป

Regular Expressions เป็นเครื่องมือที่มีประโยชน์สำหรับการจัดการข้อความใน PHP การเรียนรู้พื้นฐานของ Metacharacters, Quantifiers, และ Character Classes จะช่วยให้คุณสามารถสร้าง pattern ที่มีประสิทธิภาพและจัดการกับข้อความได้อย่างยืดหยุ่น ในบทถัดไป เราจะเรียนรู้เกี่ยวกับการตรวจสอบความถูกต้องของข้อมูลผู้ใช้ ซึ่ง Regex จะมีบทบาทสำคัญในการตรวจสอบรูปแบบของข้อมูลต่างๆ

Office.in.th Custom Service

이 구조를 바탕으로 시스템을 개발하거나 맞춤 변경하고 싶으신가요?

Office.in.th는 엔터프라이즈 웹 애플리케이션, API 연동, 공공/민간 업무 관리 시스템을 설계·개발하며 장기 지원을 제공합니다.

소프트웨어 개발 서비스 보기