从PHP中的字符串中提取所有多字节字符

时间:2014-06-09 01:31:09

标签: php string unicode utf-8

我正在尝试实现适用于亚洲字符的str_word_count()版本。但是,我不知道如何在给定的UTF-8字符串中分隔单字节和多字节字符。我将使用哪些函数来查找字符串中的多字节字符?

例如,我可能希望沿着单字节和多字节字符之间的边界拆分字符串。

'Test中国test中国' => array('Test','中国','test','中国');

我该怎么做?

1 个答案:

答案 0 :(得分:0)

有许多功能可以做到这一点,特别是Multibyte String Functions,但重要的是要注意所有多字节字符都算作1.这里有几个例子:

$str_en = "test";
$str_ch = '中国';

echo $str_en . " " . (str_word_count($str_en)) . " word(s)" . "\n";
echo $str_ch . " " . (mb_strlen($str_ch,'utf8')) . " word(s)" . "\n"; 
echo mb_strlen($str_ch,'utf8') + str_word_count($str_en) . " word(s) total";

输出:

test 1 word(s)
中国 2 word(s)
3 word(s) total

上面的示例使用mb_strlen,而下一个示例使用preg_match来检测循环遍历数组时的非ascii字符。

$var = array('Test','中国','test','中国');

foreach($var as $char) {
    if (preg_match('/[\x80-\xFF]/', $char, $match)) {
        echo $char . " - " . mb_detect_encoding($char) . " - " .  str_word_count($char) . "word(s) \n";
        /* Detect character encoding with current detect_order */
    } else {
        /* Detect character encoding with current detect_order */
        echo $char . " - " . mb_detect_encoding($char) . " - " .  str_word_count($char) . "word(s) \n";
    }
}

print_r($ match)。 " \ n&#34 ;; //仅显示匹配的非ascii字符

输出:

Test - ASCII - 1 word(s) 
中国 - UTF-8 - 2 word(s) 
test - ASCII - 1 word(s) 
中国 - UTF-8 - 2 word(s)