PlusMagi's Blog By Pitt Phunsanit Uncategorized PHP: การตรวจสอบคำในสตริงด้วย str_contains()

PHP: การตรวจสอบคำในสตริงด้วย str_contains()

ในโลกของการพัฒนาเว็บด้วย PHP การจัดการกับสตริง (String Manipulation) เป็นทักษะพื้นฐานที่ขาดไม่ได้ และหนึ่งในงานที่พบบ่อยที่สุดคือการตรวจสอบว่าข้อความยาวๆ มีคำหรือรูปแบบย่อยที่เราต้องการอยู่ภายในหรือไม่ ก่อนหน้านี้ นักพัฒนาอาจต้องใช้ฟังก์ชันอย่าง strpos() ซึ่งแม้จะใช้งานได้ แต่ก็มีข้อจำกัดในการอ่านโค้ด (Readability) และมักจะต้องมีการเปรียบเทียบค่าที่ส่งกลับมาด้วยการตรวจสอบความเท่าเทียมแบบเข้มงวด (Strict Comparison: !== false) เพื่อให้มั่นใจว่าไม่ได้เกิดกรณีที่ strpos() คืนค่าเป็น 0 ซึ่งจะทำให้เกิดข้อผิดพลาดทางตรรกะได้

นั่นคือเหตุผลที่ PHP ตั้งแต่เวอร์ชัน 8.0 ได้แนะนำฟังก์ชัน str_contains(string $haystack, string $needle): bool เข้ามาใช้งาน ฟังก์ชันนี้ถูกออกแบบมาเพื่อแก้ไขปัญหาดังกล่าวโดยเฉพาะ มันทำหน้าที่ตรวจสอบอย่างตรงไปตรงมาว่าสตริงหลัก ($haystack) มีการบรรจุคำย่อยที่ระบุ ($needle) อยู่หรือไม่ โดยมีข้อดีหลักคือ:

  • ความชัดเจน (Clarity): โค้ดอ่านง่ายกว่ามาก เพราะฟังก์ชันถูกตั้งชื่อมาเพื่อวัตถุประสงค์นี้โดยเฉพาะ
  • ประสิทธิภาพ (Performance): ถูกปรับปรุงให้ทำงานได้อย่างรวดเร็วและมีประสิทธิภาพสูงในระดับ C-level ของ PHP Engine
  • ความปลอดภัยทางตรรกะ: มันส่งกลับค่า Boolean (true หรือ false) โดยตรง ทำให้ไม่ต้องมีการตรวจสอบ !== false ที่ซับซ้อนอีกต่อไป

ตัวอย่างการใช้งานและรูปแบบโค้ด (Code Examples)

สมมติว่าเรากำลังสร้างระบบ Content Moderation ที่ต้องการตรวจสอบว่าบทความที่ผู้ใช้ส่งเข้ามานั้น มีคำหยาบคายหรือคีย์เวิร์ดต้องห้ามหรือไม่ การใช้ str_contains() จะทำให้โค้ดของเรากระชับและเข้าใจได้ทันที

<?php
/**
 * ตัวอย่างการใช้งาน str_contains() ใน PHP 8.0+
 * ฟังก์ชันนี้ใช้ตรวจสอบว่าสตริงหลักมีคำย่อยที่กำหนดอยู่หรือไม่
 */

// 1. กรณีที่พบคำ (Success Case)
$articleContent = "PHP เป็นภาษาโปรแกรมมิ่งที่ทรงพลังและเรียนรู้ง่าย";
$keywordToFind = "โปรแกรม";

if (str_contains($articleContent, $keywordToFind)) {
    echo "✅ ผลลัพธ์ 1: พบคำว่า '{$keywordToFind}' ในบทความ เนื้อหาผ่านการตรวจสอบเบื้องต้น";
} else {
    echo "❌ ผลลัพธ์ 1: ไม่พบคำที่กำหนดในเนื้อหา";
}

echo "";


// 2. กรณีที่ไม่พบคำ (Failure Case)
$articleContent = "การพัฒนาเว็บด้วย PHP ต้องใช้ความรู้พื้นฐานที่ดี";
$keywordToFind = "JavaScript"; // คำนี้ไม่มีในเนื้อหา

if (str_contains($articleContent, $keywordToFind)) {
    echo "✅ ผลลัพธ์ 2: พบคำว่า '{$keywordToFind}'";
} else {
    // นี่คือกรณีที่เราต้องการจัดการเมื่อไม่พบคำ
    echo "❌ ผลลัพธ์ 2: ไม่พบคำว่า '{$keywordToFind}' ในบทความ เนื้อหาอาจต้องถูกบล็อกหรือแจ้งเตือนผู้ใช้";
}

echo "";


// 3. การตรวจสอบค่าว่าง (Edge Case)
$emptyContent = "";
$keywordToFind = "test";

if (!str_contains($emptyContent, $keywordToFind)) {
    echo "✅ ผลลัพธ์ 3: เมื่อสตริงหลักว่างเปล่า จะส่งกลับ false เสมอ";
}

?>

ข้อควรระวัง Security และ Best Practices

  • คำนึงถึงความปลอดภัย (Security): เนื่องจาก str_contains() เป็นฟังก์ชันที่ทำงานกับสตริงภายใน PHP โดยตรง จึงไม่เสี่ยงต่อการโจมตีแบบ Injection (เช่น SQL Injection) อย่างไรก็ตาม หากค่าของ $needle มาจาก Input ของผู้ใช้โดยตรง ควรมีการทำ Sanitization เสมอ เพื่อป้องกันการแสดงผลข้อมูลที่ไม่พึงประสงค์ หรือการทำให้โค้ดทำงานผิดพลาดเมื่อเจออักขระพิเศษ
  • Performance: สำหรับการตรวจสอบคำแบบง่ายๆ (Simple Substring Check) str_contains() คือตัวเลือกที่ดีที่สุด แต่หากความต้องการของเราคือการค้นหารูปแบบที่ซับซ้อน เช่น ต้องมีตัวเลขตามด้วยตัวอักษรภาษาอังกฤษอย่างน้อย 3 ตัว เราจะต้องใช้ Regular Expressions ผ่านฟังก์ชัน preg_match() แทน
  • Error Handling: ฟังก์ชันนี้มีความเสถียรสูงและไม่ค่อยเกิด Exception เว้นแต่ว่าเราจะส่งค่าที่ไม่ใช่สตริง (Non-string type) เข้าไป ซึ่งในกรณีนั้นควรใช้ Type Hinting ในการกำหนด Signature ของฟังก์ชันเพื่อป้องกันตั้งแต่ต้นทาง

สรุปและการนำไปประยุกต์ใช้งาน

โดยสรุป str_contains() คือเครื่องมือที่ทันสมัย มีประสิทธิภาพ และอ่านง่ายที่สุดสำหรับการตรวจสอบการมีอยู่ของสตริงย่อยใน PHP เวอร์ชันปัจจุบัน มันช่วยลดความซับซ้อนและข้อผิดพลาดทางตรรกะที่เคยเกิดขึ้นจากการใช้ฟังก์ชันเก่าๆ อย่าง strpos()

กรณีการนำไปใช้งานจริง (Production Use Cases):

  • Content Filtering: การตรวจสอบคำหยาบหรือคีย์เวิร์ดต้องห้ามก่อนเผยแพร่บทความ
  • API Response Validation: ตรวจสอบว่า JSON หรือ XML ที่ได้รับจาก API มี Key หรือค่าที่คาดหวังอยู่หรือไม่ (แม้จะใช้กับ Array/Object ได้ แต่หลักการก็คือการตรวจสอบ ‘การมีอยู่’)
  • Log Analysis: การค้นหา Error Code หรือ User ID เฉพาะเจาะจงในไฟล์ Log ขนาดใหญ่ เพื่อแจ้งเตือนผู้ดูแลระบบ

การทำความเข้าใจและใช้ str_contains() อย่างถูกต้อง จะช่วยยกระดับคุณภาพของโค้ด PHP ของคุณให้เป็นไปตามมาตรฐาน Best Practice ในระดับ Senior Developer ได้อย่างแน่นอน