strlen()
PHP strlen() 函數
定義和用法
strlen() 函數返回字串的長度。
文法
strlen(string)
參數:string
描述:必需。規定要檢查的字串。
代碼如下 |
複製代碼 |
<?php $str=‘中文a字1符‘; echo strlen($str); echo ‘<br />‘; echo mb_strlen($str,‘UTF8‘); //輸出結果 //14 //6 ?>
|
結果分析:在strlen計算時,對待一個UTF8的中文字元是3個長度,所以“中文a字1符”長度是3*4+2=14
在mb_strlen計算時,選定內碼為UTF8,則會將一個中文字元當作長度1來計算,所以“中文a字1符”長度是6
mb_strlen()函數
需要注意的是,mb_strlen並不是PHP核心函數,使用前需要確保在php.ini中載入了php_mbstring.dll,即確保
“extension=php_mbstring.dll”這一行存在並且沒有被注釋掉,否則會出現未定義函 數的問題。
代碼如下 |
複製代碼 |
<?php $str=‘中文a字1符‘; //計算如下 echo (strlen($str) + mb_strlen($str,‘UTF8‘)) / 2; echo //輸出結果 //10 ?> |
“中文a字1符” 的strlen($str)值是14,mb_strlen($str)值是6,則可以計算出“中文a字1符”的佔位是10.
講解這兩者之間的區別
代碼如下 |
複製代碼 |
<?php
//測試時檔案的編碼方式要是UTF8 $str='中文a字1符'; echo strlen($str).'<br>';//14 echo mb_strlen($str,'utf8').'<br>';//6 echo mb_strlen($str,'gbk').'<br>';//8 echo mb_strlen($str,'gb2312').'<br>';//10 ?> |
結果分析:在strlen計算時,對待一個UTF8的中文字元是3個長度,所以“中文a字1符”長度是3*4+2=14,在mb_strlen
計算時,選定內碼為UTF8,則會將一個中文字元當作長度1來計算,所以“中文a字1符”長度是6 .
雖然上面函數可以簡單解決一些中英文混合問題,但是不能用於實實際中,下面我來給各位朋友介紹其它比較好的辦
法。
PHP擷取中英文混合字串長度的實現代碼如下,1中文=1位,2英文=1位,可自行修改
代碼如下 |
複製代碼 |
/** * PHP擷取字串中英文混合長度 * @param $str string 字串 * @param $$charset string 編碼 * @return 返回長度,1中文=1位,2英文=1位 */ function strLength($str,$charset='utf-8'){ if($charset=='utf-8') $str = iconv('utf-8','gb2312',$str); $num = strlen($str); $cnNum = 0; for($i=0;$i<$num;$i++){ if(ord(substr($str,$i+1,1))>127){ $cnNum++; $i++; } } $enNum = $num-($cnNum*2); $number = ($enNum/2)+$cnNum; return ceil($number); } //測試輸出長度都為15 $str1 = '測試測試測試測試測試測試測試測'; $str2 = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'; $str3 = 'aa測試aa測試aa測試aa測試aaaaaa'; echo strLength($str1,'gb2312'); echo strLength($str2,'gb2312'); echo strLength($str3,'gb2312'); |
截取字串函數
UTF8編碼,在UTF8中,一個中文字元佔3個位元組
代碼如下 |
複製代碼 |
function msubstr($str, $start, $len) { $tmpstr = ""; $strlen = $start + $len; for($i = 0; $i < $strlen; $i++){ if(ord(substr($str, $i, 1)) > 127){ $tmpstr.=substr($str, $i, 3); $i+=2; }else $tmpstr.= substr($str, $i, 1); } return $tmpstr; } echo msubstr("一二三天下致公english",0,10); |
GB2312編碼,在gb2312中,一個中文字元佔2個位元組
代碼如下 |
複製代碼 |
<?php function msubstr($str, $start, $len) { //ȡ $tmpstr = ""; $strlen = $start + $len; if(preg_match('/[/d/s]{2,}/',$str)){$strlen=$strlen-2;} for($i = 0; $i < $strlen; $i++) { if(ord(substr($str, $i, 1)) > 0xa0) { $tmpstr .= substr($str, $i, 2); $i++; } else $tmpstr .= substr($str, $i, 1); } return $tmpstr; } ?> |
編碼相容性良好的函數
代碼如下 |
複製代碼 |
function cc_msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true) { if(function_exists("mb_substr")) return mb_substr($str, $start, $length, $charset); elseif(function_exists('iconv_substr')) { return iconv_substr($str,$start,$length,$charset); } $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); $slice = join("",array_slice($match[0], $start, $length)); if($suffix) return $slice."…"; return $slice; } |