ตัดบางส่วนจากข้อความภาษาไทยด้วย PHP Multibyte String

โปรแกรมประเภทเว็บบอร์ดหรือเว็บ Social ที่ต้องการตัดบางส่วนจากข้อความหรือบทความที่ยาว เพื่อเป็นตัวอย่าง แสดงในหน้าแรก หรือการ Share หัวข้อบทความเป็นตัวอย่าง จากเว็บไซต์อื่นๆ

หากเป็นภาษาอังกฤษ สามารถทำได้อย่างง่าย แต่ปัญหาคือเวลาตัดคำภาษาไทย มักจะไม่ได้ตามที่ต้องการ และอาจมีอักษรประหลาดแสดงขึ้นมาด้วย

ในบทความนี้จะแสดงการใช้ฟังก์ชั่น PHP Multibyte String เพื่อตัดบางส่วนของข้อความได้ตามต้องการได้

หมายเหตุ เครื่องที่ใช้ทดสอบ ตั้งค่าภาษาในรูปแบบ UTF-8

$ echo $LANG
en_US.UTF-8

ถ้าเป็นภาษาอังกฤษ สามารถเขียนโปรแกรม PHP โดยใช้ฟังก์ชั่น substr เช่นต้องการข้อความโดยตัดตั้งแต่อักษรตัวแรก (0) ยาวไปจำนวน 7 ตัว

<?php
$en_msg = 'This is an example';
print substr($en_msg, 0, 7) . "\n";
?>

รันโปรแกรม ก็จะได้ข้อความตามที่ต้องการ

$ php test-substr.php
This is

แต่ถ้าเป็นข้อความภาษาไทย ข้อความที่ตัดได้จะไม่ใช่ เช่น ต้องการตั้งแต่อักษรตัวแรก (0) ยาวไปจำนวน 15 ตัวอักษร<

<?php
$th_msg = 'ตัวอย่างข้อความภาษาไทยที่ใช้ทดสอบ';
print substr($th_msg, 0, 15) . "\n";
?>

ทดลองรันจะได้ตามตัวอย่าง

$ php test-substr.php
ตัวอย

เนื่องมาจากฟังก์ชั่น substr ไม่สามารถจัดการตัวอักษร UTF-8 ได้อย่างถูกต้อง จำเป็นต้องเปลี่ยนไปใช้ฟังก์ชั่น Multibyte String substr (mb_substr)

รูปแบบการใช้ฟังก์ชั่น mb_substr จะเหมือนกับ substr เพียงแต่ต้องระบุรูปแบบของภาษาด้วย<

<?php
$th_msg = 'ตัวอย่างข้อความภาษาไทยที่ใช้ทดสอบ';
print mb_substr($th_msg, 0, 15, 'UTF-8');
?>

ทดลองรันโปรแกรม

$ php test-substr.php
PHP Fatal error:  Call to undefined function mb_substr() in /home/user1/mbstring/test-substr.php on line 3
หากขึ้น error แบบนี้ แสดงว่าไม่ได้ติดตั้งโมดูล Multibyte String ใน PHP

ต้องคอมไพล์ PHP ใหม่ หรือติดตั้งไฟล์ rpm ชื่อ php-mbstring เพิ่มเติม

สามารถรัน php ตามด้วยออปชั่น ‘-m’ เพื่อดูว่ามีโมดูล mbstring แล้วหรือไม่

หากติดตั้งเพิ่มเติมเรียบร้อยแล้ว

$ php -m | grep mbstring
mbstring

ทดลองรันอีกครั้ง ก็จะขึ้นจำนวนตัวอักษรถูกต้อง

$ php test-substr.php
ตัวอย่างข้อความ

ข้อมูลอ้างอิง

1 thought on “ตัดบางส่วนจากข้อความภาษาไทยด้วย PHP Multibyte String”

  1. ขอบคุณมากครับ มีประโยชน์มากๆๆเลย ติดอยู่ตรงนี้พอดี

Leave a Reply