str_word_count()
已编辑(显示新线索):使用PHP v5.1有一个可能的解决方案!
function my_word_count($str, $myLangChars="àáãâçêéíîóõôúÀÁÃÂÇÊÉÍÎÓÕÔÚ") {
return str_word_count($str, 0, $myLangChars);
}
但不是 100%,因为我尝试添加到 $myLangChars \xC2\xAD
(SHy - SOFT HYPHEN字符),它必须是任何语言的单词组件,并且它不起作用(请参阅)。
另一个,不是那么快,但完整且灵活的解决方案(从这里提取),基于 PCRE 库,但可以选择模仿str_word_count()
non-valid-UTF8 上的行为:
/**
* Like str_word_count() but showing how preg can do the same.
* This function is most flexible but not faster than str_word_count.
* @param $wRgx the "word regular expression" as defined by user.
* @param $triggError changes behaviour causing error event.
* @param $OnBadUtfTryAgain when true mimic the str_word_count behaviour.
* @return 0 or positive integer as word-count, negative as PCRE error.
*/
function preg_word_count($s,$wRgx='/[-\'\p{L}\xC2\xAD]+/u', $triggError=true,
$OnBadUtfTryAgain=true) {
if ( preg_match_all($wRgx,$s,$m) !== false )
return count($m[0]);
else {
$lastError = preg_last_error();
$chkUtf8 = ($lastError==PREG_BAD_UTF8_ERROR);
if ($OnBadUtfTryAgain && $chkUtf8)
return preg_word_count(
iconv('CP1252','UTF-8',$s), $wRgx, $triggError, false
);
elseif ($triggError) trigger_error(
$chkUtf8? 'non-UTF8 input!': "error PCRE_code-$lastError",
E_USER_NOTICE
);
return -$lastError;
}
}
(模板答案)帮助赏金!
(这不是答案,是对赏金的帮助,因为我既不能编辑也不能复制问题)
我们想计算 UTF-8 拉丁文本中的“真实世界单词”。
为了赏金,我们需要:
- 符合以下
assert
s 且比 更快的函数str_word_count
;
- 或
str_word_count
使用 SHy 角色(如何?);
- 或
preg_word_count
工作得更快(使用 preg_replace?单词分隔符正则表达式?)。
断言
假设存在“多字节安全”函数 my_word_count()
,则以下断言必须为真:
assert_options(ASSERT_ACTIVE, 1);
$text = "1,2,3,4=0 (1 2 3 4)=0 (... ,.)=0 (2.5±0.1; 0.5±0.2)=0";
assert( my_word_count($text)==0 ); // no word there
$text = "(one two,three;four)=4 (five-six se\xC2\xADven)=2";
assert( my_word_count($text)==6 ); // hyphen merges two words
$text = "(um±dois três)=3 (àáãâçêéíîóõôúÀÁÃÂÇÊÉÍÎÓÕÔÚ)=1";
assert( my_word_count($text)==4 ); // a UTF8 case
$text = "(ÍSÔ9000-X, ISÔ 9000-X, ÍSÔ-9000-X)=6"; //Codes are words?
assert( my_word_count($text)==6 ); // suppose no: X is another word