国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > PHP > 正文

PHP獲取中英混合字符串長度的方法

2020-03-22 17:46:43
字體:
供稿:網(wǎng)友
今晚在寫框架的表單驗證類時,需要判斷某個字符串長度是否在指定區(qū)間內(nèi),很自然地,想到了PHP中的strlen函數(shù)
復(fù)制代碼 代碼如下:
$str = 'Hello world!';
echo strlen($str);// 輸出12
然而在PHP自帶的函數(shù)中,strlen及mb_strlen都是通過計算字符串所占字節(jié)數(shù)來計算長度的,在不同的編碼情況下,中文所占的字節(jié)數(shù)是不同的。在GBK/GB2312下,中文字符占2個字節(jié),而在UTF-8下,中文字符占3個字節(jié)。
復(fù)制代碼 代碼如下:
$str = '你好,世界!';
echo strlen($str);// GBK或GB2312下輸出12,UTF-8下輸出18
而我們在判斷字符串長度時往往需要判斷的是字符的數(shù)量,而非字符串所占字節(jié)數(shù),如在UTF-8下的這段PHP代碼:
復(fù)制代碼 代碼如下:
$name = '張耕暢';
$len = strlen($name);
// 輸出 FALSE,因為在UTF-8下三個中文占9個字節(jié)
if($len = 3 && $len = 8){
echo 'TRUE';
}else{
echo 'FALSE';
}
那么有什么方便而實用的方法可以獲得含中文字符串的長度呢?可以用正則計算出中文字符的個數(shù),在GBK/GB2312編碼下除以2,UTF-8編碼下則除以3,最后再加上非中文字符串的長度,但這樣未免太過麻煩。WordPress這么一段代碼,借鑒如下:
復(fù)制代碼 代碼如下:
$str = 'Hello,世界!';
preg_match_all('/./us', $str, $match);
echo count($match[0]);// 輸出9
思想是用html' target='_blank'>正則表達式將字符串分割成單個字符,并直接用count計算出匹配到的字符數(shù),便是我們想要的結(jié)果了。但以上代碼在UTF-8編碼下并不能處理GBK/GB2312的中文字符串,因為GBK/GB2312的中文字符會被識別為兩個字符而計算出來的中文字符數(shù)量會翻倍,于是我想到了這么一個辦法:
復(fù)制代碼 代碼如下:
$tmp = @iconv('gbk', 'utf-8', $str);
if(!empty($tmp)){
$str = $tmp;
}
preg_match_all('/./us', $str, $match);
echo count($match[0]);
兼容GBK/GB2312及UTF-8編碼,經(jīng)小量數(shù)據(jù)測試通過,但暫未確定是否完全正確,盼有大牛指點一二。以上本意是為了框架可以兼容多種編碼格式,但一般在日常開發(fā)中,一個項目是已經(jīng)可以確定為何種編碼的,因此可以使用以下函數(shù)來方便地獲取字符串長度:
復(fù)制代碼 代碼如下:
int iconv_strlen ( string $str [, string $charset = ini_get("iconv.internal_encoding") ] )
PHP教程

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 石家庄市| 新蔡县| 镇康县| 彝良县| 邢台县| 邵阳县| 海林市| 桃源县| 探索| 武冈市| 阿克| 洞头县| 铜陵市| 易门县| 晋宁县| 谢通门县| 桑植县| 兰溪市| 元氏县| 兰溪市| 巧家县| 襄汾县| 吉木萨尔县| 枣强县| 芜湖市| 宽甸| 常德市| 宾川县| 望都县| 吉安县| 三都| 长丰县| 淳化县| 香格里拉县| 布尔津县| 敖汉旗| 彰化县| 略阳县| 广饶县| 游戏| 武鸣县|