3

我需要有以下 unicode 字符串的字数。使用str_word_count

$input = 'Hello, chào buổi sáng'; 
$count = str_word_count($input);
echo $count;

结果是

7

这显然是错误的。

如何得到想要的结果(4)?

4

4 回答 4

2
$tags = 'Hello, chào buổi sáng'; 
$word = explode(' ', $tags);
echo count($word);

这是一个演示:http ://codepad.org/667Cr1pQ

于 2013-08-19T03:15:06.363 回答
2

这是一个快速而肮脏的基于正则表达式(使用 Unicode)的字数计数功能:

function mb_count_words($string) {
    preg_match_all('/[\pL\pN\pPd]+/u', $string, $matches);
    return count($matches[0]);
}

“单词”是包含以下一项或多项的任何内容:

  • 任何字母
  • 任何数字
  • 任何连字符/破折号

这意味着以下内容包含 5 个“单词”(4 个正常,1 个连字符):

 echo mb_count_words('Hello, chào buổi sáng, chào-sáng');

现在,这个功能不太适合非常大的文本;尽管它应该能够处理互联网上的大部分文本块。这是因为preg_match_all需要构建和填充一个大数组,一旦计数就将其丢弃(效率非常低)。一种更有效的计数方法是逐个字符地遍历文本,识别 unicode 空白序列,并增加一个辅助变量。这不会那么困难,但它很乏味并且需要时间。

于 2013-08-19T04:51:18.253 回答
2

您可以使用此函数计算给定字符串中的 unicode 单词:

function count_unicode_words( $unicode_string ){

  // First remove all the punctuation marks & digits
  $unicode_string = preg_replace('/[[:punct:][:digit:]]/', '', $unicode_string);

  // Now replace all the whitespaces (tabs, new lines, multiple spaces) by single space
  $unicode_string = preg_replace('/[[:space:]]/', ' ', $unicode_string);

  // The words are now separated by single spaces and can be splitted to an array
  // I have included \n\r\t here as well, but only space will also suffice
  $words_array = preg_split( "/[\n\r\t ]+/", $unicode_string, 0, PREG_SPLIT_NO_EMPTY );

  // Now we can get the word count by counting array elments
  return count($words_array);
}

所有学分归作者所有。

于 2018-03-09T17:36:40.593 回答
0

我正在使用此代码来计算字数。你可以试试这个

$s = 'Hello, chào buổi sáng'; 
 $s1 = array_map('trim', explode(' ', $s));
 $s2 = array_filter($s1, function($value) { return $value !== ''; });
echo count($s2);
于 2018-03-05T07:24:14.670 回答