count支持UTF8的数组中单词的实例数



我正在创建一个PHP站点的jquery标签云。在我的mysql数据库中,我有一个"标签"字段,其中将有一个逗号分隔的单词列表。我想生成一个单词数组,它的出现频率与单词的出现频率相同。为了使事情复杂化,文本将全部使用希伯来语(utf8编码)。

在英语中这个解决方案是完美的:

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

带有希伯来文本的数组不被填充。

我发现这个post str_word_count()函数不能正确显示阿拉伯语,虽然它工作,它只给出单词数量的总数,而不像前面的函数那样创建结果数组。

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

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

有什么建议吗?

虽然这不是您希望得到的答案,但我建议您首先重新考虑您的db设计。将多个标签用逗号分隔在一个字段中并不是很聪明。您应该为标签构建一个只有两列的分隔表:

  1. 标记
  2. 对应对象的id/post或任何你的应用关于

有很多优点:

  • 更容易删除或添加标签。
  • 你可以得到你正在寻找的数组没有一些蹩脚的php代码与一个单一的sql查询,如"选择标签,计数(id)从标签组由标签"
  • 当你有很多标签时,这更容易,更快捷。
  • 最后但并非最不重要的是,我敢打赌(不确定),MySQL不会有不同的字母问题,你显然得到在php-

可以使用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'被定义为区域设置包含字母字符的依赖字符串,也可以包含但不以"'"one_answers"-"开头的字符

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

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

最新更新