Monday, September 17, 2007

แก้ปัญหา 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:

Anonymous said...

ขอบคุณมากครับ ช่วยชีวิตผมไว้เลยเนี่ย

Anonymous said...

ผมเพิ่งได้มีโอกาศใช utf8 ครับ ผมปัญหามากมาย ได้ข้อมู,ตรงนี้ก็แก้ได้อีกเปราะ ขอบคุณครับ