今天我來和大家聊一下php中的mb_strlen函數(shù)。在我們的web開發(fā)中,我們經(jīng)常會(huì)處理字符串的長度問題,如果是單字節(jié)字符,可以直接使用php自帶的strlen函數(shù),但是如果是多字節(jié)字符(比如中文),則需要使用mb_strlen函數(shù)。
舉個(gè)例子,如果我們要統(tǒng)計(jì)一個(gè)字符串中字符的個(gè)數(shù),如果使用strlen函數(shù),會(huì)出現(xiàn)中英文字符算一個(gè)字符的情況,如下代碼所示:
$string = "Hello 世界"; echo strlen($string); //輸出12
可以看到,使用strlen函數(shù)計(jì)算出的字符串長度是12個(gè)字符,而實(shí)際上中文字符應(yīng)該算兩個(gè)字符。如果我們使用mb_strlen函數(shù),代碼如下:
$string = "Hello 世界"; echo mb_strlen($string, 'utf-8'); //輸出8
可以看到,使用mb_strlen函數(shù)計(jì)算出的字符串長度是8個(gè)字符,正是我們想要的結(jié)果。
那么為什么要使用mb_strlen函數(shù)呢?因?yàn)樵趗tf-8編碼中,一個(gè)中文字符由3個(gè)字節(jié)表示,而它所對(duì)應(yīng)的unicode碼只有一個(gè),因此使用strlen函數(shù)計(jì)算中文字符的長度時(shí)會(huì)出現(xiàn)錯(cuò)誤的結(jié)果。
如果我們想統(tǒng)計(jì)字符串中某個(gè)子串出現(xiàn)的次數(shù),同樣需要使用mb_strlen函數(shù)。比如我們要統(tǒng)計(jì)"世界"這個(gè)子串在上面的$string變量中出現(xiàn)的次數(shù),我們可以這么做:
$string = "Hello 世界,Hello 世界"; $sub_str = "世界"; $count = 0; $offset = 0; while (($pos = mb_strpos($string, $sub_str, $offset, 'utf-8')) !== false) { $offset = $pos + mb_strlen($sub_str, 'utf-8'); $count++; } echo $count; //輸出2
可以看到,我們使用mb_strpos函數(shù)來查找子串在字符串中的位置,并且在第四個(gè)參數(shù)上指定編碼為utf-8。在計(jì)算子串長度時(shí)同樣使用mb_strlen函數(shù),這樣可以確保中文字符不會(huì)被誤算。
總結(jié)一下,如果我們的字符串中包含了中文字符或其他多字節(jié)字符,需要計(jì)算字符串長度或者統(tǒng)計(jì)子串出現(xiàn)次數(shù)時(shí),就需要使用mb_strlen函數(shù)。