php判斷字串長度 strlen()與mb_strlen()函數

來源:互聯網
上載者:User

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;
}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.