Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 107,996

HOME > PHP > PHP Forum > [แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับตัวอักษรแบบ UTF-8 และ ภาษาไทย (ไม่นับวรรณยุกต์และสระบนล่าง)



 

[แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับตัวอักษรแบบ UTF-8 และ ภาษาไทย (ไม่นับวรรณยุกต์และสระบนล่าง)

 



Topic : 076169



โพสกระทู้ ( 173 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook



สาเหตุที่ทำ
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
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2012-03-27 07:25:37 By : petzaza009 View : 22440 Reply : 10
 

 

No. 1



โพสกระทู้ ( 74,042 )
บทความ ( 838 )

สมาชิกที่ใส่เสื้อไทยครีเอท

สถานะออฟไลน์
Twitter Facebook

แจ่มครับ ขอ Shared หน่อย






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-03-27 08:57:25 By : webmaster
 


 

No. 2



โพสกระทู้ ( 173 )
บทความ ( 0 )



สถานะออฟไลน์
Twitter Facebook

ตอบความคิดเห็นที่ : 1 เขียนโดย : webmaster เมื่อวันที่ 2012-03-27 08:57:25
รายละเอียดของการตอบ ::
ฟังก์ชั่นสุดท้ายยังไม่เสร็จนะคับ กำลังเพิ่มคุณสมบัติเพิ่มเติม

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-03-27 09:04:28 By : petzaza009
 

 

No. 3

Guest


ดีมาก
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-03-27 18:53:44 By : Fp
 


 

No. 4



โพสกระทู้ ( 6 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบคุณมากครับ สุดยอดจริงๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-19 10:29:03 By : sky
 


 

No. 5



โพสกระทู้ ( 11,835 )
บทความ ( 10 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Facebook

เป็นการใส่ใจรายละเอียดของงานที่ถือว่าเยี่ยมครับ แต่ระวังเรื่อง performance ด้วยนะครับ เพราะบางอย่างมันต้องแลกกัน
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2012-04-19 10:40:50 By : ikikkok
 


 

No. 6

Guest


ขอบคุณครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-03 21:13:34 By : เลือกมังกร
 


 

No. 7



โพสกระทู้ ( 107 )
บทความ ( 0 )



สถานะออฟไลน์


สุดยอดๆ คร้าบๆๆๆๆ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-08-03 23:14:47 By : pengbuts
 


 

No. 8

Guest


ขอบคุณค่ะ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2014-04-29 15:56:11 By : neo
 


 

No. 9

Guest


nได้แต่มาหาความรู้ อันนี้ประทับใจจริงๆ ยอดเยี่ยมมากn
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2015-09-23 10:11:19 By : acitmaster
 


 

No. 10



โพสกระทู้ ( 1 )
บทความ ( 0 )



สถานะออฟไลน์


ขอบพระคุณมากๆ ครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2016-02-25 19:42:15 By : AbacuZ
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : [แจก] ฟังก์ชั่น str-split(), strlen(), substr() สำหรับตัวอักษรแบบ UTF-8 และ ภาษาไทย (ไม่นับวรรณยุกต์และสระบนล่าง)
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม

Load balance : Server 05
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2019 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 08-9968-0655 อัตราราคา คลิกที่นี่