|
|
|
[แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับตัวอักษรแบบ UTF-8 และ ภาษาไทย (ไม่นับวรรณยุกต์และสระบนล่าง) |
|
|
|
|
|
|
|
สาเหตุที่ทำ
1. เนื่องจากผมเจอปัญหาต้องการตัดคำแล้วเติม ... ต่อท้าย สำหรับทำหัวข้อข่าวหรือกระทู้ที่มีตัวอักษรยาวเกินกำหนด
แต่ปัญหาจะเกิดสำหรับภาษาไทยเพราะฟังก์ชั่นที่มีอยู่ของ PHP นั้นจะนับสระและวรรณยุกต์ด้านบนและล่างของข้อความ ทำให้ภาษาไทยสั้นกว่าภาษาอังกฤษ
2. ผมหาฟังก์ชั่นจากที่ต่างๆ แล้วที่เขาทำแจกไว้ แต่ก็ยังไม่ตรงกับความต้องการของผม เลยนำฟังก์ชั่นที่เขาแจกมาดัดแปลงใหม่และคิดว่าน่าจะมีหลายท่านที่ประสบปัญหานี้อยู่
สิ่งที่ได้
เนื่องสิ่งที่ผมต้องการ มันต้องใช้ฟังก์ชั่น ทำให้ได้ฟังก์ชั่น มา 3 ตัว สามารถนำไปใช้งานอื่นๆ เพิ่มเติมได้อีก
ฟังก์ชั่นที่แจก
1. getMBStrSplit
ฟังก์ชั่นสำหรับแบ่งข้อความเป็น Array (ปกติใช้ str_split() แต่สำหรับภาษาไทยแบบ UTF-8 จะมีปัญหาการแบ่ง)
Function Code
// Convert a string to an array with multibyte string
function getMBStrSplit($string, $split_length = 1){
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
$split_length = ($split_length <= 0) ? 1 : $split_length;
$mb_strlen = mb_strlen($string, 'utf-8');
$array = array();
$i = 0;
while($i < $mb_strlen)
{
$array[] = mb_substr($string, $i, $split_length);
$i = $i+$split_length;
}
return $array;
}
Description
array getMBStrSplit ( string $string [, int $split_length = 1 ] )
Parameters
string
ข้อความที่ต้องการนำมาแบ่ง
split_length
จำนวนความยาวของตัวอักษรที่จะแบ่ง (ค่าปริยายคือ 1)
Examples
ตัวอย่างการใช้ getMBStrSplit()
<?php
$str = "สวัสดีชาวโลก";
$arr1 = getMBStrSplit($str);
$arr2 = getMBStrSplit($str, 3);
print_r($arr1);
print_r($arr2);
?>
ผลลัพธ์
Array
(
[0] => ส
[1] => ว
[2] => ั
[3] => ส
[4] => ด
[5] => ี
[6] => ช
[7] => า
[8] => ว
[9] => โ
[10] => ล
[11] => ก
)
Array
(
[0] => สวั
[1] => สดี
[2] => ชาว
[3] => โลก
)
2. getStrLenTH
ฟังก์ชั่นสำหรับหาความยาวของข้อความสำหรับภาษาไทยแบบ UTF-8 โดยจะไม่นับวรรณยุกต์หรือสระด้านบนกับด้านล่างข้อความ
(ปกติใช้ strlen() แต่สำหรับภาษาไทยแบบ UTF-8 จะมีปัญหาการนับจำนวนที่เกิน และนับวรรณยุกต์หรือสระด้วย)
Function Code
// Get string length for Character Thai
function getStrLenTH($string)
{
$array = getMBStrSplit($string);
$count = 0;
foreach($array as $value)
{
$ascii = ord(iconv("UTF-8", "TIS-620", $value ));
if( !( $ascii == 209 || ($ascii >= 212 && $ascii <= 218 ) || ($ascii >= 231 && $ascii <= 238 )) )
{
$count += 1;
}
}
return $count;
}
Description
int getStrLenTH ( string $string )
Parameters
string
ข้อความที่ต้องการนับ
Examples
ตัวอย่างการใช้ getStrLenTH()
<?php
$str = 'สวัสดีชาวโลก';
echo getStrLenTH($str); // 10
$str = 'เรารักประเทศไทย';
echo getStrLenTH($str); // 14
?>
3. getSubStrTH
ฟังก์ชั่นสำหรับตัดตำแหน่งตัวอักษรที่ต้องการสำหรับภาษาไทยแบบ UTF-8 โดยจะนับตำแหน่งเฉพาะพยัญชนะ สระ อักขระพิเศษที่อยู่ในบรรทัด ไม่นับสระหรือวรรณยุกต์ ที่อยู่ด้านบนหรือล่างบรรทัด
(ปกติใช้ strlen() แต่สำหรับภาษาไทยแบบนับจำนวนที่เกิน และนับสระหรือวรรณยุกต์ ที่อยู่ด้านบนหรือล่างบรรทัดด้วย ทำให้ข้อความสั้นกว่าข้อความที่เป็นภาษาอังกฤษ)
Function Code
// Get part of string for Character Thai
function getSubStrTH($string, $start, $length)
{
$length = ($length+$start)-1;
$array = getMBStrSplit($string);
$count = 0;
$return = "";
for($i=$start; $i < count($array); $i++)
{
$ascii = ord(iconv("UTF-8", "TIS-620", $array[$i] ));
if( $ascii == 209 || ($ascii >= 212 && $ascii <= 218 ) || ($ascii >= 231 && $ascii <= 238 ) )
{
//$start++;
$length++;
}
if( $i >= $start )
{
$return .= $array[$i];
}
if( $i >= $length )
break;
}
return $return;
}
Description
string getSubStrTH ( string $string , int $start [, int $length ] )
Parameters
string
ข้อความที่ต้องการนำมาตัด
start
ตำแหน่งเริ่มต้นที่จะเก็บข้อความ โดนต่ำแหน่งแรกคือ 0 (ยังไม่สามารถทำให้ใช้คำสั่งติดลบได้นะครับ เช่น -10 แบบฟังก์ฟัน substr() )
length
ความยาวของตัวอักษรที่จะเก็บ นับจากต่ำแหน่งเริ่มต้น ( $start )
Examples
ตัวอย่างการใช้ getStrLenTH()
<?php
$str = 'ประเทศไทยน่าอยู่';
echo getSubStrTH($str, 0, 9); // ประเทศไทย
$str = 'เรารักประเทศไทย';
echo getSubStrTH($str, 6, 40); // ประเทศไทย
?>
ตัวอย่างสำหรับใช้ในการตัดคำแสดงกระทู้หรือข่าวสาร ไม่ให้เกินจำนวนตัวอักษรที่เรากำหนด
Examples Topic Worl Wrap (ในตัวอย่างนี้กำหนดห้ามเกิน 50 ตัวอักษร
<?php
//Examples 1
$Topic = "[แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับตัวอักษรแบบ UTF-8 และ ภาษาไทย (ไม่นับวรรณยุกต์และสระบนล่าง)";
echo (getStrLenTH($Topic) > 50) ? getSubStrTH($Topic, 0, 50). "..." : $Track;
//Examples 1
echo "<br />";
//Examples 2
$Topic = "HTML5 Articles, Examples, Tricks and Tips ความรู้เกี่ยวกับเทรนใหม่ HTML 5...ห้า...ห้า...ห้า ^___^ ";
if( getStrLenTH($Topic) > 50)
{
echo getSubStrTH($Topic, 0, 50). "...";
}
else
{
echo $Topic;
}
//Examples 2
?>
ผลลัพธ์
[แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับต...
HTML5 Articles, Examples, Tricks and Tips ความรู้เกี่ย...
ลองนำไปใช้ดูนะคับ ใครนำไปดัดแปลงอะไรก็แล้วแต่สะดวกคับ
ถ้าได้อะไรใหม่ๆ ก็มาแบ่งปันกันด้วยนะครับ เพื่อสังคมแห่งการแบ่งปัน(น้ำใจ)
Tag : PHP
|
ประวัติการแก้ไข 2012-03-27 07:27:46 2012-03-27 07:29:22 2012-03-27 07:47:35 2012-03-27 17:55:55 2012-03-27 17:56:49 2012-03-27 18:03:07 2012-03-27 18:05:40
|
|
|
|
|
Date :
2012-03-27 07:25:37 |
By :
petzaza009 |
View :
32671 |
Reply :
10 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
แจ่มครับ ขอ Shared หน่อย
|
|
|
|
|
Date :
2012-03-27 08:57:25 |
By :
webmaster |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ดีมาก
|
|
|
|
|
Date :
2012-03-27 18:53:44 |
By :
Fp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณมากครับ สุดยอดจริงๆ
|
|
|
|
|
Date :
2012-04-19 10:29:03 |
By :
sky |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
เป็นการใส่ใจรายละเอียดของงานที่ถือว่าเยี่ยมครับ แต่ระวังเรื่อง performance ด้วยนะครับ เพราะบางอย่างมันต้องแลกกัน
|
|
|
|
|
Date :
2012-04-19 10:40:50 |
By :
ikikkok |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณครับ
|
|
|
|
|
Date :
2013-08-03 21:13:34 |
By :
เลือกมังกร |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
สุดยอดๆ คร้าบๆๆๆๆ
|
|
|
|
|
Date :
2013-08-03 23:14:47 |
By :
pengbuts |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบคุณค่ะ
|
|
|
|
|
Date :
2014-04-29 15:56:11 |
By :
neo |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
nได้แต่มาหาความรู้ อันนี้ประทับใจจริงๆ ยอดเยี่ยมมากn
|
|
|
|
|
Date :
2015-09-23 10:11:19 |
By :
acitmaster |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ขอบพระคุณมากๆ ครับ
|
|
|
|
|
Date :
2016-02-25 19:42:15 |
By :
AbacuZ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 05
|