PHP preg_match(): นิพจน์ทั่วไป (Regex)

⚡ สรุปอย่างชาญฉลาด

นิพจน์ปกติ (Regular Expressions) ใน PHP เป็นเครื่องมือจับคู่รูปแบบที่ใช้ตรวจสอบความถูกต้อง แยก และแทนที่ข้อความด้วยนิพจน์เดียว บทแนะนำนี้จะครอบคลุมฟังก์ชันหลัก ได้แก่ preg_match, preg_split และ preg_replace อธิบายอักขระพิเศษที่ใช้กันทั่วไป และสร้างรูปแบบการตรวจสอบความถูกต้องของอีเมลที่ใช้งานได้จริงทีละขั้นตอน

  • 🧩 Regex คืออะไร: นิพจน์ปกติ (Regular expression) คือรูปแบบที่ใช้อธิบายข้อความ ทำให้ฟังก์ชันหนึ่งสามารถตรวจสอบความถูกต้อง ค้นหา หรือแปลงสตริงได้
  • การจับคู่พรีจี: preg_match ทดสอบว่ารูปแบบปรากฏอยู่ในสตริงหรือไม่ และจะส่งคืนค่า true เมื่อพบรูปแบบที่ตรงกันครั้งแรก เหมาะสำหรับการตรวจสอบความถูกต้อง
  • 🇧🇷 การแยกพรีก: ฟังก์ชัน `preg_split` จะแบ่งสตริงออกเป็นอาร์เรย์ทุกครั้งที่พบรูปแบบที่กำหนด เช่น การแบ่งประโยคตามช่องว่าง
  • 🔁 พรีก_รีเพลส: ฟังก์ชัน `preg_replace` จะค้นหาข้อความที่ตรงกับรูปแบบที่กำหนดทั้งหมดและแทนที่ด้วยข้อความใหม่ ซึ่งมีประโยชน์สำหรับการสร้างเทมเพลตและการเน้นข้อความ
  • 🔤 เมตาคาริเออร์: สัญลักษณ์ต่างๆ เช่น ., ^, $, * และ + สามารถสร้างรูปแบบที่ซับซ้อนได้ เช่น การกำหนดจุดเริ่มต้นหรือจุดสิ้นสุดของการจับคู่
  • 📧 รูปแบบอีเมล: คลาสอักขระและตัวกำหนดปริมาณจะรวมกันเป็นรูปแบบเดียวที่ตรวจสอบว่าที่อยู่อีเมลนั้นถูกต้องตามรูปแบบหรือไม่
  • 🤖 AI ช่วยเหลือ: เครื่องมือ AI สามารถสร้างนิพจน์ปกติ (regex) จากคำอธิบายธรรมดา และอธิบายหรือแก้ไขข้อผิดพลาดของรูปแบบที่มีอยู่ที่ซับซ้อนได้

นิพจน์ปกติของ PHP

Regular expression ใน PHP คืออะไร?

นิพจน์ปกติของ PHPนิพจน์ปกติ (Regular Expression หรือ regex) เป็นเครื่องมือจับคู่รูปแบบที่มีประสิทธิภาพ ซึ่งสามารถทำได้ด้วยนิพจน์เดียว นิพจน์ปกติใช้ตัวอักษรพิเศษ เช่น +, -, และ ^ เพื่อสร้างนิพจน์ที่ซับซ้อน นิพจน์ปกติสามารถช่วยคุณในการทำงานต่างๆ เช่น การตรวจสอบความถูกต้องของที่อยู่อีเมล ที่อยู่ IP และอื่นๆ

เหตุใดจึงต้องใช้นิพจน์ทั่วไป

  • นิพจน์ปกติ (Regular Expression) ใน PHP ช่วยให้การระบุรูปแบบในข้อมูลสตริงง่ายขึ้นโดยการเรียกใช้ฟังก์ชันเพียงครั้งเดียว ซึ่งช่วยประหยัดเวลาในการเขียนโค้ด
  • เมื่อตรวจสอบความถูกต้องของข้อมูลที่ผู้ใช้ป้อน เช่น ที่อยู่อีเมล ชื่อโดเมน หมายเลขโทรศัพท์ และที่อยู่ IP
  • การเน้นคำสำคัญในผลการค้นหา
  • เมื่อสร้างเทมเพลต HTML ที่กำหนดเอง Regex ใน PHP สามารถใช้เพื่อระบุแท็กเทมเพลตและแทนที่ด้วยข้อมูลจริง

ฟังก์ชันนิพจน์ทั่วไปในตัวใน PHP

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

  • ฟังก์ชัน `preg_match()` ใน PHP ใช้สำหรับทำการจับคู่รูปแบบในสตริง โดยจะคืนค่า `true` หากพบการจับคู่ และคืนค่า `false` หากไม่พบการจับคู่
  • ฟังก์ชัน `preg_split()` ใน PHP ใช้สำหรับค้นหารูปแบบที่ต้องการในสตริง แล้วแยกผลลัพธ์ออกเป็นอาร์เรย์ตัวเลข
  • preg_replace() ใน PHP - ฟังก์ชันนี้ใช้เพื่อจับคู่รูปแบบกับสตริง จากนั้นแทนที่การจับคู่ด้วยข้อความที่ระบุ

ด้านล่างนี้คือไวยากรณ์สำหรับฟังก์ชันนิพจน์ปกติ เช่น preg_match(), preg_split() หรือ preg_replace()

<?php
function_name('/pattern/',subject);
?>

ที่นี่

  • “function_name(…)” คือ preg_match(), preg_split() หรือ preg_replace()
  • เครื่องหมาย “/…/” แสดงถึงจุดเริ่มต้นและจุดสิ้นสุดของนิพจน์ปกติของเรา
  • “'/pattern/'” คือรูปแบบที่เราต้องจับคู่
  • “เรื่อง” คือสตริงข้อความที่จะจับคู่

ต่อไปนี้เราจะมาดูตัวอย่างการใช้งานจริงของฟังก์ชัน regex ใน PHP ที่กล่าวมาข้างต้นกัน

Preg_match() ใน PHP

ตัวอย่างแรกใช้ฟังก์ชัน preg_match() เพื่อทำการจับคู่รูปแบบอย่างง่ายสำหรับคำว่า guru ในข้อความที่กำหนด URL.

โค้ดด้านล่างแสดงการใช้งานฟังก์ชัน preg_match() สำหรับตัวอย่างข้างต้น

<?php
$my_url = "www.guru99.com";
if (preg_match("/guru/", $my_url))
{
echo "the url $my_url contains guru";
}
else
{
echo "the url $my_url does not contain guru";
}
?>

เรียกดูไฟล์ URL http://localhost/phptuts/preg_match_simple.php

ฟังก์ชันนิพจน์ทั่วไปในตัว

เรามาตรวจสอบส่วนของโค้ดที่รับผิดชอบผลลัพธ์ที่เราต้องการกันเถอะ preg_match('/guru/', $my_url). ที่นี่,

  • “preg_match(…)” เป็นฟังก์ชัน PHP regex
  • “'/guru/'” คือรูปแบบนิพจน์ทั่วไปที่จะจับคู่
  • “$my_url” คือตัวแปรที่มีข้อความที่จะจับคู่

PHP Preg_split()

ต่อไปนี้เราจะมาดูตัวอย่างอื่นที่ใช้ฟังก์ชัน preg_split() กัน

เราจะนำวลีสตริงมาขยายเป็นอาร์เรย์ รูปแบบที่จะจับคู่เป็นช่องว่างเดียว

สตริงข้อความที่จะใช้ในตัวอย่างนี้คือ "ฉันชอบนิพจน์ทั่วไป"

รหัสด้านล่างแสดงให้เห็นถึงการดำเนินการตามตัวอย่างข้างต้น

<?php

$my_text = "I Love Regular Expressions";

$my_array = preg_split("/ /", $my_text);

print_r($my_array );

?>

เรียกดูไฟล์ URL http://localhost/phptuts/preg_split.php

PHP Preg_split()

PHP Preg_replace()

ต่อไปเรามาดูฟังก์ชัน preg_replace() กันครับ ฟังก์ชั่น PHP ที่ทำการจับคู่รูปแบบแล้วแทนที่รูปแบบด้วยอย่างอื่น

โค้ดด้านล่างค้นหาคำว่า guru ใน a เชือก.

โค้ดนี้จะแทนที่คำว่า "guru" ด้วยคำว่า "guru" ที่ล้อมรอบด้วยโค้ด CSS ที่เน้นสีพื้นหลัง

<?php

$text = "We at Guru99 strive to make quality education affordable to the masses. Guru99.com";

$text = preg_replace("/Guru/", '<span style="background:yellow">Guru</span>', $text);

echo $text;

?>

สมมติว่าคุณได้บันทึกไฟล์ preg_replace.php แล้ว ให้เข้าไปที่ไฟล์นั้น URL http://localhost/phptuts/preg_replace.php

PHP Preg_replace()

เมตาอักขระนิพจน์ปกติ

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

เมตาคาแรคเตอร์ Descriptไอออน ตัวอย่าง
. จับคู่อักขระเดี่ยวใดๆ ยกเว้นบรรทัดใหม่ /./ จับคู่ทุกสิ่งที่มีอักขระตัวเดียว
^ ตรงกับจุดเริ่มต้นของสตริงหรือยกเว้นอักขระบางตัว /^PH/ จับคู่สตริงใดๆ ที่ขึ้นต้นด้วย PH
$ ตรงกับรูปแบบที่ปลายสตริง /com$/ ตรงกับ guru99.com, yahoo.com เป็นต้น
* ตรงกับอักขระก่อนหน้าศูนย์ตัวขึ้นไป /com*/ ตรงกับคอมพิวเตอร์ การสื่อสาร ฯลฯ
+ ต้องมีอักขระที่อยู่ข้างหน้าปรากฏอย่างน้อยหนึ่งครั้ง /yah+oo/ ตรงกับ yahoo
\ ใช้เพื่อหลีกเลี่ยงอักขระพิเศษ /yahoo+\.com/ ถือว่าจุดเป็นค่าตัวอักษร
[... ] คลาสตัวละคร /[abc]/ ตรงกับ a, b หรือ c
อาริโซน่า จับคู่ตัวอักษรตัวพิมพ์เล็ก /az/ ตรงกับความเท่ มีความสุข ฯลฯ
อาริโซน่า ตรงกับตัวอักษรตัวพิมพ์ใหญ่ /AZ/ จับคู่ อะไร อย่างไร ทำไม ฯลฯ
0-9 จับคู่ตัวเลขใดๆ ระหว่าง 0 ถึง 9 /0-4/ ตรงกับ 0,1,2,3,4

รายการด้านบนจะแสดงเฉพาะ meta character ที่ใช้บ่อยที่สุดในนิพจน์ทั่วไปเท่านั้น

ต่อไปนี้เราจะมาดูตัวอย่างที่ค่อนข้างซับซ้อนซึ่งตรวจสอบความถูกต้องของที่อยู่อีเมลกัน

<?php
$my_email = "name@company.com";
if (preg_match("/^[a-zA-Z0-9._-]+@[a-zA-Z0-9-]+\.[a-zA-Z.]{2,5}$/", $my_email)) {
echo "$my_email is a valid email address";
}
else
{
echo "$my_email is NOT a valid email address";
}
?>

อธิบายรูปแบบการตรวจสอบความถูกต้องของอีเมล

ที่นี่

  • เครื่องหมาย “/…/” เป็นตัวเริ่มต้นและตัวสิ้นสุดของนิพจน์ปกติ
  • “^[a-zA-Z0-9._-]” ตรงกับตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่ ตัวเลขระหว่าง 0 ถึง 9 และจุด ขีดล่าง หรือขีดกลาง
  • “+@[a-zA-Z0-9-]” จะตรงกับสัญลักษณ์ @ ตามด้วยตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่ ตัวเลขระหว่าง 0 ถึง 9 หรือเครื่องหมายขีดกลาง
  • “+\.[a-zA-Z.]{2,5}$/” จะใช้เครื่องหมายแบ็กสแลชเพื่อหลีกเลี่ยงจุด จากนั้นจะจับคู่ตัวอักษรพิมพ์เล็กหรือพิมพ์ใหญ่ใดๆ ที่มีความยาวระหว่าง 2 ถึง 5 ตัวที่ส่วนท้ายของสตริง

เรียกดูไฟล์ URL http://localhost/phptuts/preg_match.php

รูปแบบการตรวจสอบอีเมล PHP

จากรายละเอียดข้างต้น คุณจะเห็นได้ว่าเมตาแครี่เออร์มีประสิทธิภาพมากเมื่อพูดถึงการจับคู่รูปแบบ

คำถามที่พบบ่อย

ฟังก์ชัน `preg_match` จะหยุดที่การจับคู่ครั้งแรกและเติมผลลัพธ์นั้นลงในตัวแปร `$matches` ในขณะที่ `preg_match_all` จะค้นหาการจับคู่ทั้งหมดในสตริงและส่งคืนผลลัพธ์ทั้งหมดในรูปแบบอาร์เรย์ซ้อน ซึ่งเหมาะสำหรับกรณีการใช้งานอื่นๆ เช่น...tracting รายการที่ซ้ำกัน

ตัวดัดแปลงจะอยู่หลังตัวคั่นปิดและเปลี่ยนพฤติกรรมการจับคู่ ตัวดัดแปลง i ทำให้รูปแบบไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก ตัวดัดแปลง m จะแยกแต่ละบรรทัดสำหรับ ^ และ $ และตัวดัดแปลง s อนุญาตให้จุดจับคู่กับขึ้นบรรทัดใหม่ เช่น /guru/i

ครอบส่วนต่างๆ ของรูปแบบด้วยวงเล็บเพื่อสร้างกลุ่มการจับคู่ หลังจาก preg_match การจับคู่ทั้งหมดจะอยู่ใน $matches[0] และแต่ละกลุ่มจะตามมาใน $matches[1], $matches[2] และอื่นๆ ต่อไป

ใช่ค่ะ อธิบายข้อความที่คุณต้องการจับคู่ เช่น หมายเลขโทรศัพท์หรือรูปแบบวันที่ แล้ว AI จะสร้างรูปแบบและตัวอย่างการจับคู่ให้ค่ะ ทดสอบกับข้อมูลจริงและกรณีพิเศษก่อนที่จะนำไปใช้งานจริง

ใช่แล้ว เพียงวางรูปแบบลงไป แล้ว AI จะวิเคราะห์ทีละส่วน อธิบายว่าแต่ละส่วนตรงกับอะไร และชี้ให้เห็นว่าทำไมจึงใช้งานไม่ได้กับข้อมูลป้อนเข้าบางอย่าง จากนั้นจึงแนะนำเวอร์ชันที่แก้ไขแล้ว

สรุปโพสต์นี้ด้วย: