php中計(jì)算中文字符串長度、截取中文字符串的函數(shù)代碼
更新時間:2011年08月09日 18:50:35 作者:
在做PHP開發(fā)的時候,由于我國的語言環(huán)境問題,所以我們常常需要對中文進(jìn)行處理。
在PHP中,我們都知道有專門的mb_substr和mb_strlen函數(shù),可以對中文進(jìn)行截取和計(jì)算長度,但是,由于這些函數(shù)并非PHP的核心函數(shù),所以,它們常常有可能沒有開啟。當(dāng)然,如果是用的自己的服務(wù)器,則只要在php.ini中開啟即可。如果是用的虛擬主機(jī),而服務(wù)器又沒有開啟這方面的函數(shù)的話,那就需要我們自己寫出點(diǎn)適合咱國情的函數(shù)來了。
以下幾個函數(shù)用起來頗為順手的。不過要知道,得在utf-8環(huán)境下使用。
header('Content-type:text/html;charset=utf-8');
/**
* 可以統(tǒng)計(jì)中文字符串長度的函數(shù)
* @param $str 要計(jì)算長度的字符串
* @param $type 計(jì)算長度類型,0(默認(rèn))表示一個中文算一個字符,1表示一個中文算兩個字符
*
*/
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
$str = '我們都是中國人啊,ye!';
$len = abslength($str);
var_dump($len); //return 12
$len = abslength($str,'1');
echo '<br />'.$len; //return 22
/*
utf-8編碼下截取中文字符串,參數(shù)可以參照substr函數(shù)
@param $str 要進(jìn)行截取的字符串
@param $start 要進(jìn)行截取的開始位置,負(fù)數(shù)為反向截取
@param $end 要進(jìn)行截取的長度
*/
function utf8_substr($str,$start=0) {
if(empty($str)){
return false;
}
if (function_exists('mb_substr')){
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return mb_substr($str,$start,$end,'utf-8');
}
else {
mb_internal_encoding("UTF-8");
return mb_substr($str,$start);
}
}
else {
$null = "";
preg_match_all("/./u", $str, $ar);
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return join($null, array_slice($ar[0],$start,$end));
}
else {
return join($null, array_slice($ar[0],$start));
}
}
}
$str2 = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon
支持gb2312,gbk,utf-8,big5 中文截取方法
/*
* 中文截取,支持gb2312,gbk,utf-8,big5
*
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取長度
* @param string $charset utf-8|gb2312|gbk|big5 編碼
* @param $suffix 是否加尾綴
*/
public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
if(function_exists("mb_substr"))
{
if(mb_strlen($str, $charset) <= $length) return $str;
$slice = mb_substr($str, $start, $length, $charset);
}
else
{
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
if(count($match[0]) <= $length) return $str;
$slice = join("",array_slice($match[0], $start, $length));
}
if($suffix) return $slice."…";
return $slice;
}
以下幾個函數(shù)用起來頗為順手的。不過要知道,得在utf-8環(huán)境下使用。
復(fù)制代碼 代碼如下:
header('Content-type:text/html;charset=utf-8');
/**
* 可以統(tǒng)計(jì)中文字符串長度的函數(shù)
* @param $str 要計(jì)算長度的字符串
* @param $type 計(jì)算長度類型,0(默認(rèn))表示一個中文算一個字符,1表示一個中文算兩個字符
*
*/
function abslength($str)
{
if(empty($str)){
return 0;
}
if(function_exists('mb_strlen')){
return mb_strlen($str,'utf-8');
}
else {
preg_match_all("/./u", $str, $ar);
return count($ar[0]);
}
}
$str = '我們都是中國人啊,ye!';
$len = abslength($str);
var_dump($len); //return 12
$len = abslength($str,'1');
echo '<br />'.$len; //return 22
/*
utf-8編碼下截取中文字符串,參數(shù)可以參照substr函數(shù)
@param $str 要進(jìn)行截取的字符串
@param $start 要進(jìn)行截取的開始位置,負(fù)數(shù)為反向截取
@param $end 要進(jìn)行截取的長度
*/
function utf8_substr($str,$start=0) {
if(empty($str)){
return false;
}
if (function_exists('mb_substr')){
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return mb_substr($str,$start,$end,'utf-8');
}
else {
mb_internal_encoding("UTF-8");
return mb_substr($str,$start);
}
}
else {
$null = "";
preg_match_all("/./u", $str, $ar);
if(func_num_args() >= 3) {
$end = func_get_arg(2);
return join($null, array_slice($ar[0],$start,$end));
}
else {
return join($null, array_slice($ar[0],$start));
}
}
}
$str2 = 'wo要截取zhongwen';
echo '<br />';
echo utf8_substr($str2,0,-4); //return wo要截取zhon
支持gb2312,gbk,utf-8,big5 中文截取方法
復(fù)制代碼 代碼如下:
/*
* 中文截取,支持gb2312,gbk,utf-8,big5
*
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取長度
* @param string $charset utf-8|gb2312|gbk|big5 編碼
* @param $suffix 是否加尾綴
*/
public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
if(function_exists("mb_substr"))
{
if(mb_strlen($str, $charset) <= $length) return $str;
$slice = mb_substr($str, $start, $length, $charset);
}
else
{
$re['utf-8'] = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
$re['gbk'] = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
$re['big5'] = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";
preg_match_all($re[$charset], $str, $match);
if(count($match[0]) <= $length) return $str;
$slice = join("",array_slice($match[0], $start, $length));
}
if($suffix) return $slice."…";
return $slice;
}
您可能感興趣的文章:
- PHP字符串長度計(jì)算 - strlen()函數(shù)使用介紹
- php自定義函數(shù)實(shí)現(xiàn)統(tǒng)計(jì)中文字符串長度的方法小結(jié)
- 最準(zhǔn)確的php截取字符串長度函數(shù)
- 利用PHP函數(shù)計(jì)算中英文字符串長度的方法
- PHP中preg_match函數(shù)正則匹配的字符串長度問題
- php strlen mb_strlen計(jì)算中英文混排字符串長度
- 詳解PHP中strlen和mb_strlen函數(shù)的區(qū)別
- 淺析PHP中strlen和mb_strlen的區(qū)別
- 自己寫的php中文截取函數(shù)mb_strlen和mb_substr
- PHP中strlen()和mb_strlen()的區(qū)別淺析
- php中strlen和mb_strlen用法實(shí)例分析
- php常用字符串長度函數(shù)strlen()與mb_strlen()用法實(shí)例分析
相關(guān)文章
php實(shí)現(xiàn)算術(shù)驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了php實(shí)現(xiàn)算術(shù)驗(yàn)證碼功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-12-12
php 過濾英文標(biāo)點(diǎn)符號及過濾中文標(biāo)點(diǎn)符號代碼
這篇文章主要介紹了php過濾英文標(biāo)點(diǎn)符號及過濾中文標(biāo)點(diǎn)符號的方法,需要的朋友可以參考下2014-06-06
php實(shí)現(xiàn)從ftp服務(wù)器上下載文件樹到本地電腦的程序
功能:完成從ftp服務(wù)器端下載文件到本地電腦(整體復(fù)制即目錄樹是一樣的)2009-02-02
利用PHP擴(kuò)展vld查看PHP opcode操作步驟
首先下載最新版vld擴(kuò)展接下來編譯安裝vld擴(kuò)展最后將生成的vld.so復(fù)制到extension_dir目錄下然后修改php.ini文件接下來創(chuàng)建test.php文件,感興趣的你可以參考下本文2013-03-03
PHP7下協(xié)程的實(shí)現(xiàn)方法詳解
最近在學(xué)習(xí)中遇到了協(xié)程,發(fā)現(xiàn)這類文章介紹的較少,所以下面這篇文章主要給大家介紹了關(guān)于PHP7下協(xié)程的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
php如何調(diào)用webservice應(yīng)用介紹
Web Service也叫XML Web Service WebService是一種可以接收從Internet或者Intranet上的其它系統(tǒng)中傳遞過來的請求,輕量級通訊技術(shù),接下來將詳細(xì)介紹php如何調(diào)用webservice,需要的朋友可以了解下2012-11-11
MySQL的FIND_IN_SET函數(shù)使用方法分享
有個文章表里面有個type字段,他存儲的是文章類型,有 1頭條,2推薦,3熱點(diǎn),4圖文 …..11,12,13等等2012-03-03

