PlusMagi's Blog By Pitt Phunsanit Backend,computer science,Data Transformation,Documentation,Programming PHP: การเปรียบเทียบสตริงสตาร์ท/ลงท้ายด้วย str_starts_with() และ str_ends_with()

PHP: การเปรียบเทียบสตริงสตาร์ท/ลงท้ายด้วย str_starts_with() และ str_ends_with()

ในฐานะนักพัฒนา PHP ระดับ Senior การจัดการกับสตริง (String Manipulation) เป็นทักษะพื้นฐานที่ต้องใช้บ่อยครั้ง หนึ่งในสถานการณ์ที่เรามักพบคือการตรวจสอบว่าสตริงหนึ่ง ๆ นั้น “เริ่มต้นด้วย” หรือ “ลงท้ายด้วย” ข้อความบางส่วนหรือไม่ ในอดีต เราอาจใช้วิธีการที่ซับซ้อน เช่น การใช้ Regular Expressions (Regex) หรือการตัดสตริงย่อย (substr()) ซึ่งแม้ว่าจะทำได้ แต่ก็ทำให้โค้ดมีความยาวและอ่านยาก

PHP ได้พัฒนาฟังก์ชันเฉพาะทางขึ้นมาเพื่อแก้ไขปัญหานี้โดยตรง นั่นคือ str_starts_with() และ str_ends_with() ฟังก์ชันเหล่านี้ถูกเพิ่มเข้ามาใน PHP เวอร์ชัน 8 ขึ้นไป โดยมีหลักการทำงานที่เรียบง่ายและทรงพลัง: พวกมันรับสตริงเป้าหมาย (haystack) และสตริงส่วนย่อยที่ต้องการตรวจสอบ (needle) แล้วคืนค่าเป็น Boolean (true หรือ false) ทันที

การใช้ฟังก์ชันเหล่านี้ไม่เพียงแต่ช่วยให้โค้ดของเรามีความกระชับและอ่านง่ายขึ้นอย่างมากเท่านั้น แต่ยังเป็นการใช้ Built-in Function ที่ได้รับการ Optimize มาแล้วจาก PHP Core ทำให้ในแง่ของประสิทธิภาพ (Performance) มักจะดีกว่าการเขียน Logic ด้วยตนเองด้วยซ้ำ การเข้าใจหลักการทำงานนี้จึงเป็นสิ่งสำคัญสำหรับนักพัฒนาที่ต้องการโค้ดที่มีคุณภาพสูงและทันสมัย


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

ตัวอย่างโค้ดด้านล่างนี้แสดงให้เห็นถึงการเปรียบเทียบการทำงานของทั้งสองฟังก์ชันในสถานการณ์ต่างๆ ตั้งแต่กรณีที่ตรงกันสมบูรณ์ ไปจนถึงกรณีที่เป็น Edge Cases เช่น การตรวจสอบสตริงว่างเปล่า (Empty String) หรือเมื่อส่วนย่อยนั้นมีความยาวเท่ากับสตริงทั้งหมด

<?php
/**
 * PHP String Prefix/Suffix Checker using str_starts_with() and str_ends_with()
 * ต้องใช้ PHP 8.0 ขึ้นไป
 */

$filename = "report_2024_q3.pdf";
$prefixCheck = "report_"; // ตรวจสอบว่าขึ้นต้นด้วย 'report_' หรือไม่
$suffixCheck = ".pdf";    // ตรวจสอบว่าลงท้ายด้วย '.pdf' หรือไม่

echo "--- 📂 การตรวจสอบไฟล์: {$filename} ---\n";

// 1. การใช้ str_starts_with() (Prefix Check)
if (str_starts_with($filename, $prefixCheck)) {
    echo "[SUCCESS] ผ่านการตรวจสอบ Prefix: ขึ้นต้นด้วย '{$prefixCheck}'\n";
} else {
    echo "[FAIL] ไม่ผ่านการตรวจสอบ Prefix: ไม่ได้ขึ้นต้นด้วย '{$prefixCheck}'\n";
}

// 2. การใช้ str_ends_with() (Suffix Check)
if (str_ends_with($filename, $suffixCheck)) {
    echo "[SUCCESS] ผ่านการตรวจสอบ Suffix: ลงท้ายด้วย '{$suffixCheck}'\n";
} else {
    echo "[FAIL] ไม่ผ่านการตรวจสอบ Suffix: ไม่ได้ลงท้ายด้วย '{$suffixCheck}'\n";
}

echo "\n=========================================\n";

// 3. ตัวอย่าง Edge Case: การเปรียบเทียบกับสตริงที่สั้นกว่า
$shortString = "test";
$checkPrefixShort = "t"; // ตรวจสอบแค่ตัวอักษรแรก
$checkSuffixLong = "testing"; // ยาวเกินไป

echo "--- 🧪 Edge Case Test ---\n";

// กรณี Prefix ที่สั้นมาก (ควรผ่าน)
if (str_starts_with($shortString, $checkPrefixShort)) {
    echo "[SUCCESS] '{$shortString}' เริ่มต้นด้วย '{$checkPrefixShort}'\n";
}

// กรณี Suffix ที่ยาวเกินไป (ควรล้มเหลว)
if (!str_ends_with($shortString, $checkSuffixLong)) {
    echo "[SUCCESS] '{$shortString}' ไม่ได้ลงท้ายด้วย '{$checkSuffixLong}' (ตามที่คาดไว้)\n";
}

// 4. การตรวจสอบสตริงว่างเปล่า (Empty String)
$emptyString = "";
if (str_starts_with($emptyString, "")) {
    echo "[SUCCESS] สตริงว่างเปล่าเริ่มต้นด้วยสตริงว่างเปล่า (True)\n";
}

?>

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

  • คำนึงถึงความปลอดภัย (Security)
    เมื่อส่วนย่อยที่ใช้ตรวจสอบ (Needle) มาจาก Input ของผู้ใช้งานโดยตรง ควรทำการ Sanitize หรือ Validate ข้อมูลนั้นก่อนนำไปใช้เป็น Argument เพื่อป้องกันการถูกแทรกโค้ดหรือการทำงานผิดพลาดทาง Logic
  • Performance
    โดยทั่วไปแล้ว ฟังก์ชันเหล่านี้มีประสิทธิภาพสูงมาก เนื่องจากเป็น C-level built-in function อย่างไรก็ตาม หากคุณต้องทำ Loop การตรวจสอบสตริงจำนวนมหาศาล (เช่น หลักแสน) ควรพิจารณาว่าการใช้ Regex ที่เหมาะสมกว่าหรือไม่ เพื่อให้ได้ความเร็วสูงสุด
  • Error Handling
    ฟังก์ชันเหล่านี้ไม่โยน Exception เมื่อเกิดข้อผิดพลาดในการทำงาน แต่จะคืนค่า false หากมีการส่ง Argument ที่มีประเภทข้อมูลผิด (เช่น ส่ง Integer ไปแทน String) ดังนั้น ควรตรวจสอบ Type Hinting ของตัวแปรที่เข้ามาเสมอเพื่อความมั่นใจในโค้ด

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

โดยสรุปแล้ว str_starts_with() และ str_ends_with() คือเครื่องมือที่ทันสมัยและจำเป็นอย่างยิ่งสำหรับนักพัฒนา PHP ยุคใหม่ พวกมันช่วยยกระดับความสามารถในการอ่านโค้ด (Readability) ให้สูงขึ้นอย่างเห็นได้ชัด ทำให้เราไม่ต้องพึ่งพา Logic ที่ซับซ้อนเพื่อการตรวจสอบพื้นฐาน

กรณีการนำไปใช้ใน Production ที่แนะนำ

  • ตรวจสอบว่าไฟล์ที่อัปโหลดมานั้นลงท้ายด้วยนามสกุลที่ปลอดภัยหรือไม่ (เช่น str_ends_with($filename, '.jpg'))
  • ตรวจสอบว่า URL ที่ได้รับมาเริ่มต้นด้วยโปรโตคอลที่ถูกต้องหรือไม่ (เช่น str_starts_with($url, 'https://'))
  • API Key Validation
    ตรวจสอบว่า Token หรือ API Key นั้นขึ้นต้นด้วย Prefix เฉพาะของระบบเราหรือไม่ เพื่อเพิ่มความปลอดภัยในการระบุตัวตน

อ่านเพิ่มเติม