我正在一个php站点中创建一个jquery tagcloud。在我的mysql数据库中,我有一个“标签”字段,其中有一个逗号分隔的单词列表。我想生成一个具有出现频率的单词数组。更复杂的是,文本都是希伯来语(utf8编码的)。
在英语中,这个解决方案非常有效:
$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,虽然它可以工作,但它只给出了单词的总数,并且不像前面的函数那样创建一个结果数组。
我希望结果看起来像这样:
Array
(
[happy] => 4
[beautiful] => 1
[lines] => 3
[pear] => 2
[gin] => 1
[rock] => 1
)有什么建议吗?
发布于 2013-06-18 22:44:58
可以制作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的语义;特别是,如果您在str_word_count的以下注释中用"UTF-8“替换"locale dependent”,则结果适用于以下情况
在此函数中,‘
’被定义为包含字母字符的与区域设置相关的字符串,字母字符也可以包含但不以"'“和"-”字符开头。
此外,字符'和-被视为单词的一部分,但不能作为单词的开头;但是,在$charlist参数中指定的任何字符都可以作为单词的开头,这意味着指定'和/或-会略微更改函数的工作方式。此行为也与原始str_word_count匹配。
同样有趣的是,您可以通过将\pL适当地替换为字符属性(如\p{Greek} --参见PCRE Unicode reference ),使该函数仅识别Unicode脚本的某些子集。
发布于 2013-06-18 21:58:54
虽然这并不是您所希望的答案,但我首先鼓励您重新考虑您的DB设计。在一个字段中保存几个用逗号分隔的标签并不是很聪明。您应该为只有两列的标记构建一个单独的表:
相应对象/post的
的任何内容
它有很多优点:
<代码>F215中明显遇到的不同字母表的问题
https://stackoverflow.com/questions/17170543
复制相似问题