str_word_count无法正确处理非拉丁字符

时间:2014-03-31 00:37:27

标签: php character non-latin

我正在使用php 5.3,我想计算某些文字的单词以获得验证原因。 我的问题是我对验证文本的javascript功能,根据php功能返回不同数量的单词。

这是php代码:

//trim it
$text = strip_tags(html_entity_decode($text,ENT_QUOTES));
// replace numbers with X
$text = preg_replace('/\d/', 'X', $text);
// remove ./,/-/&
$text = str_replace(array('.',',','-','&'), '', $text);
// number of words
$count = str_word_count($text);

我注意到使用php 5.5,我得到了正确数量的单词但是没有使用php 5.3。 我搜索了一下,我发现这个链接(http://grokbase.com/t/php/php-bugs/12c14e0y6q/php-bug-bug-63663-new-str-word-count-does-not-properly-handle-non-latin-characters)解释了php 5.3与拉丁字符有关的错误。我试着用这段代码解决它:

// remove non-utf8 characters
$text = preg_replace('/[^(\x20-\x7F)]*/','', $text);

但我仍然没有得到正确的结果。基本上,单词的数量非常接近结果,有时准确,但我经常遇到问题。

我决定创建另一个PHP功能来修复bug。这是php代码:

//trim it
$text = strip_tags(html_entity_decode($text,ENT_QUOTES));
// replace multiple (one ore more) line breaks with a single space
$text = preg_replace("/[\n]+/", " ", $text);
// replace multiple (one ore more) spaces with a separator string (@SEPARATOR@)
$text = preg_replace("/[\s]+/", "@SEPARATOR@", $text);
// explode the separator string (@SEPARATOR@) and get the array
$text_array = explode('@SEPARATOR@', $text);
// get the numbers of the array/words
$count = count($text_array);
// check if the last key of the array is empty and decrease the count by one 
$last_key = end($text_array);
if (empty($last_key)) {
    $count--;
}

最后一个代码对我来说很好,我想问两个问题:

  1. 关于str_word_count函数的第一种情况我该怎么办?
  2. 如果我的第二个解决方案是准确的,还是我可以采取一些措施来改进它?

2 个答案:

答案 0 :(得分:0)

;您是否考虑使用正则表达式拆分来计算单词的数量,使用您自己对单词的定义。我可能会推荐/ [^ \ s] + /作为' word',这意味着要拆分/ \ s /并计算生成的'单词数组'。

PHP:让$input = 'your input here'然后count(pregsplit('/\s/', $input))

JS:让var input = 'your input here'然后input.split(/\s/).length

您还可以使用正则表达式字符范围来捕获要用作有效单词contense的一组字符,有关正则表达式的更多内容:http://www.geocities.jp/kosako3/oniguruma/doc/RE.txt

答案 1 :(得分:0)

  1. 假设您正在询问如何使用 str_word_count :您可以在替换任何标点符号后尝试使用:preg_replace('/[^a-zA-Z0-9\s]/','',$string)。没有你知道的“测试字符串”失败,我无法尝试,但至少你可以自己尝试。

  2. 一个改进,就是实际修剪文本,它在第一个注释中提到修剪,但第一行只是删除HTML标记。添加trim($string),然后您可以删除最后一部分:

  3. 改变前2行:

    //trim it & remove tags
    $text = trim(strip_tags(html_entity_decode($text,ENT_QUOTES)));
    

    删除:

    // check if the last key of the array is empty and decrease the count by one 
    $last_key = end($text_array);
    if (empty($last_key)) {
        $count--;
    }