แก้ปัญหา character class preg_match กับภาษาไทยที่ใช้ unicode
วันนี้พยายามลองเขียน regular expression เพื่อหาว่าตัวอักษรที่รับมาเป็นภาษาไทย และ ไม่ใช่สระ
ลองเขียนๆ ดู ใช้ preg_match แล้วก็ character class ระหว่าง ก-ฮ ปรากฎว่าเจอเหตุการณ์ไม่คาดฝัน ..echo preg_match("/^[ก-ฮ]$/", "ก"); // => 1
echo preg_match("/^[ก-ฮ]$/", "เ"); // => 1
ห๊ะ - -!
ปรากฎว่า ลองดูไปดูมา
มันเป็นเพราะว่า ถ้าเราใช้ character class เนี่ย มันจะทำการเช็คแค่ byte แรกเท่านั้น
แล้วภาษาไทยใน unicode มันใช้ทั้งหมด 3 bytes ..
ดังนั้น มันจึงเช็คแค่ byte แรกแล้วก็บอกว่าข้อความนั้น match กันเลยทันที ..
เพราะฉะนั้น วิธีการแก้ก็ง่ายๆ แค่กำหนดขนาดลงไป ..echo preg_match("/^[ก-ฮ]{3}$/", "ก"); // => 1
echo preg_match("/^[ก-ฮ]{3}$/", "เ"); // => 0
แค่นี้ก็เรียบร้อย :D
2 comments:
ขอบคุณมากครับ ช่วยชีวิตผมไว้เลยเนี่ย
ผมเพิ่งได้มีโอกาศใช utf8 ครับ ผมปัญหามากมาย ได้ข้อมู,ตรงนี้ก็แก้ได้อีกเปราะ ขอบคุณครับ
Post a Comment