PHP项目中句子平均单词数计算的异常问题及修复需求
解决PHP句子平均单词数计算的剩余异常问题
咱们先聚焦剩余的核心问题:当两个单词仅用逗号分隔(无空格)时,比如"Hello,world",当前代码会把它统计成1个单词,但正确结果应该是2个。同时还要确保之前已经解决的边界场景(无句号结尾的单句、尾随空格/标点后空格)依然保持正确。
问题根源分析
原代码的逻辑是先用strtok按,.;分割句子,再对每个句子块用空格分割单词。但当单词间只有逗号(无空格)时,strtok会把"a,b"当成一个完整的句子块,后续用空格分割自然只能得到1个元素,导致统计错误。另外,原代码的句子分割逻辑对非标准标点场景的兼容性也不够强。
修正后的完整实现
下面是调整后的代码,彻底解决所有异常场景,同时覆盖了所有边界情况:
function calculateAverageWordsPerSentence(string $text): float { // 先处理空输入的边界情况 $trimmedText = trim($text); if (empty($trimmedText)) { return 0.0; } // 步骤1:统一处理标点格式,消除空格干扰 // 把标点前后的空格统一调整为"标点+空格",同时合并连续空格 $processedText = preg_replace('/\s*([.,;!?])\s*/', '$1 ', $trimmedText); $processedText = preg_replace('/\s+/', ' ', $processedText); // 步骤2:按句子分隔符分割,过滤空句子 $sentences = preg_split('/[.;!?]/', $processedText, -1, PREG_SPLIT_NO_EMPTY); // 步骤3:统计总单词数,处理逗号分隔无空格的情况 $totalWords = 0; foreach ($sentences as $sentence) { // 把逗号和空格都作为单词分隔符,分割后过滤空元素 $wordTokens = preg_split('/[, ]+/', trim($sentence), -1, PREG_SPLIT_NO_EMPTY); $totalWords += count($wordTokens); } // 计算平均值,避免除以0的极端情况 return $totalWords / max(count($sentences), 1); }
关键改进点说明
- 统一标点格式:用正则把标点前后的空格统一处理,避免尾随空格或标点前后的空格导致空单词统计,同时合并连续空格,保证分割的准确性。
- 灵活分割句子:用
preg_split按所有常见句子分隔符(. ; ! ?)分割,并用PREG_SPLIT_NO_EMPTY过滤空句子,完美解决无句号结尾的单句问题。 - 处理逗号分隔的单词:在统计每个句子的单词时,把逗号和空格都作为单词分隔符,这样
"a,b"会被正确分割成两个单词,解决了剩余的核心问题。 - 全面覆盖边界场景:
- 空输入返回
0.0 - 无句号结尾的单句(比如
"Hello world")返回2.0 - 带尾随空格的句子(比如
"Hello world. ")正确统计 - 词后带空格的逗号(比如
"Hello , world")正确统计为2个单词 - 两词间仅用逗号分隔(比如
"Hello,world")正确统计为2个单词
- 空输入返回
测试案例验证
咱们来验证几个关键场景:
- 输入:
"Cassieres Werk zur der verbindet die des mit an"(无句号结尾)→ 返回9.0 - 输入:
"Cassieres Werk zur der, verbindet die des mit an. "(尾随空格+逗号后空格)→ 返回9.0 - 输入:
"Hello,world"(逗号分隔无空格)→ 返回2.0 - 输入:
"Hi! How are you? I'm fine,thank you."→ 句子数3,总单词数10,平均值3.333...
内容的提问来源于stack exchange,提问作者pohofo
相关产品推荐
相关产品推荐

