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

时间:2013-06-18 13:44:17

标签: php

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

英文这个解决方案完美无缺:

$words = array_count_values(str_word_count($str, 1));
print_r($words);

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

使用希伯来语文本,数组未填充。

我找到了这篇文章str_word_count() function doesn't display Arabic language properly,虽然它有效但它只提供了单词数的总计数,并且没有像上一个函数那样创建一个结果数组。

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

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

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

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

  1. 标签
  2. 相应对象/帖子的ID或您的应用程序的内容
  3. 有许多优点:

    • 删除或添加标签更容易。
    • 你可以获得你正在寻找的数组,而不需要一些带有单一SQL查询的糟糕的php代码,例如“选择标记,逐个标记的标记(id)”
    • 当你有很多标签时,这会更容易,也更快。
    • 最后但并非最不重要的是,我敢打赌(不确定),MySQL显然不会遇到不同字母的问题,显然你会在php中找到 -

答案 1 :(得分:1)

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

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的以下注释中将“locale dependent”替换为“UTF-8”,则结果适用于此

  

出于此功能的目的,'word'被定义为语言环境   依赖字符串,包含字母字符,也可以   包含但不以“'”和“ - ”字符开头。

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

值得注意的是,通过使\pL等字符属性正确替换\p{Greek},您可以使该函数仅识别Unicode脚本的某些子集 - 请参阅PCRE Unicode reference