首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php -统计支持UTF8的数组中单词的实例数

php -统计支持UTF8的数组中单词的实例数
EN

Stack Overflow用户
提问于 2013-06-18 21:44:17
回答 2查看 1.7K关注 0票数 4

我正在一个php站点中创建一个jquery tagcloud。在我的mysql数据库中,我有一个“标签”字段,其中有一个逗号分隔的单词列表。我想生成一个具有出现频率的单词数组。更复杂的是,文本都是希伯来语(utf8编码的)。

在英语中,这个解决方案非常有效:

代码语言:javascript
复制
$words = array_count_values(str_word_count($str, 1));
print_r($words);

取自此处php: sort and count instances of words in a given string

使用希伯来语文本时,数组不会填充。

我找到了这个post str_word_count() function doesn't display Arabic language properly,虽然它可以工作,但它只给出了单词的总数,并且不像前面的函数那样创建一个结果数组。

我希望结果看起来像这样:

代码语言:javascript
复制
Array
(
    [happy] => 4
    [beautiful] => 1
    [lines] => 3
    [pear] => 2
    [gin] => 1
    [rock] => 1
)

有什么建议吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-18 22:44:58

可以制作UTF-8 (仅限!)使用PHP的PCRE函数的Unicode模式的版本。

代码语言:javascript
复制
function utf8_str_word_count($string, $format = 0, $charlist = null) {
    if ($charlist === null) {
        $regex = '/\\pL[\\pL\\p{Mn}\'-]*/u';
    }
    else {
        $split = array_map('preg_quote', 
                           preg_split('//u',$charlist,-1,PREG_SPLIT_NO_EMPTY));
        $regex = sprintf('/(\\pL|%1$s)([\\pL\\p{Mn}\'-]|%1$s)*/u',
                         implode('|', $split));
    }

    switch ($format) {
        default:
        case 0:
            // For PHP >= 5.4.0 this is fine:
            return preg_match_all($regex, $string);

            // For PHP < 5.4 it's necessary to do this:
            // $results = null;
            // return preg_match_all($regex, $string, $results);
        case 1:
            $results = null;
            preg_match_all($regex, $string, $results);
            return $results[0];
        case 2:
            $results = null;
            preg_match_all($regex, $string, $results, PREG_OFFSET_CAPTURE);
            return empty($results[0])
                ? array()
                : array_combine(
                      array_map('end', $results[0]), 
                      array_map('reset', $results[0]));
    }
}

这个函数尽可能地遵循str_word_count的语义;特别是,如果您在str_word_count的以下注释中用"UTF-8“替换"locale dependent”,则结果适用于以下情况

在此函数中,‘

’被定义为包含字母字符的与区域设置相关的字符串,字母字符也可以包含但不以"'“和"-”字符开头。

此外,字符'-被视为单词的一部分,但不能作为单词的开头;但是,在$charlist参数中指定的任何字符都可以作为单词的开头,这意味着指定'和/或-会略微更改函数的工作方式。此行为也与原始str_word_count匹配。

同样有趣的是,您可以通过将\pL适当地替换为字符属性(如\p{Greek} --参见PCRE Unicode reference ),使该函数仅识别Unicode脚本的某些子集。

票数 1
EN

Stack Overflow用户

发布于 2013-06-18 21:58:54

虽然这并不是您所希望的答案,但我首先鼓励您重新考虑您的DB设计。在一个字段中保存几个用逗号分隔的标签并不是很聪明。您应该为只有两列的标记构建一个单独的表:

相应对象/post的

  1. tag
  2. id或您的应用程序关于

的任何内容

它有很多优点:

  • 删除或添加标签更容易。
  • 您可以使用像"select tag,count(id) from tag group by tag“这样的单一SQL查询来获得您要查找的数组,而无需使用一些糟糕的php查询。
  • 当您有许多标签时,这会更容易、更快。
  • 最后(但并非最不重要)我敢打赌,MySQL不会有您在php-

<代码>F215中明显遇到的不同字母表的问题

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17170543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档