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

php-计算支持UTF8的数组中单词的实例数,php,Php,我正在一个php站点中创建一个jquery标记云。 在我的mysql数据库中,我有一个“tags”字段,其中有一个逗号分隔的单词列表。 我想产生一个单词数组,它们的出现频率。 让事情复杂化的是,文本将全部用希伯来语utf8编码 在英语中,此解决方案非常有效: $words = array_count_values(str_word_count($str, 1)); print_r($words); 从这里开始 对于希伯来文文本,数组不填充 我找到了这篇文章,虽然它有效,但它只给出了单词总数,并

我正在一个php站点中创建一个jquery标记云。 在我的mysql数据库中,我有一个“tags”字段,其中有一个逗号分隔的单词列表。 我想产生一个单词数组,它们的出现频率。 让事情复杂化的是,文本将全部用希伯来语utf8编码

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

$words = array_count_values(str_word_count($str, 1));
print_r($words);
从这里开始

对于希伯来文文本,数组不填充

我找到了这篇文章,虽然它有效,但它只给出了单词总数,并且不像前面的函数那样创建结果数组

我希望结果如下所示:

Array
(
    [happy] => 4
    [beautiful] => 1
    [lines] => 3
    [pear] => 2
    [gin] => 1
    [rock] => 1
)

有什么建议吗?

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

标签 相应对象/帖子的id或应用程序的相关内容 有许多优点:

删除或添加标记更容易。 您可以通过一个SQL查询(如select tag、countid from tags group by tag)获得所需的数组,而无需一些蹩脚的php代码 当您有许多标记时,这会更容易、更快。 最后但并非最不重要的一点是,我敢打赌MySQL不会出现php中不同字母的问题-
只能制作UTF-8!使用PHP的PCRE函数的Unicode模式的版本

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的语义;特别是,如果在以下注释中用UTF-8替换依赖于语言环境的str\u word\u count,则该结果适用于此

为了实现此功能,“word”被定义为区域设置 包含字母字符的从属字符串,也可以是 包含但不以“和-字符”开头

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


还值得注意的是,通过使用字符属性(如\p{Greek})适当地替换\pL,可以使函数仅识别Unicode脚本的某些子集-请参见。

而不是str_word_count,为什么不在逗号上分解?我要注意,对于没有特定单词分隔符的语言,这将失败,像中文或日语…@deceze:是的,但对此无能为力。你可以开始使用语言分析器…:-这是一个公平的观点。。。我正在使用一个现有的CRM,我认为对于用户来说,将逗号分隔的列表添加到文本框比将项目添加到每个记录更容易。。。说到这里,对我来说实施你的建议其实相当简单。。。如果任何php解决方案不起作用,我将试用您的: