PHP实现字符串单词与数字计数:如何将带空格的连续号码计为一个词
解决方案
str_word_count 原生默认以空白字符作为单词分隔边界,没有内置参数可以自定义分隔符规则,要实现连续带空格的数字串视为一个单词,推荐以下两种可行方案:
方案1:预处理+原生str_word_count实现
思路是先临时替换数字之间的空格为不会和业务内容冲突的占位符,统计完成后再还原:
- 用正则把所有数字之间的空格替换为临时占位符(如下划线)
- 调用
str_word_count时把占位符加入允许的字符列表 - 遍历结果把占位符换回空格,得到合并后的完整号码
$string = "Patrick Kelly born in Italy. Tel. 654 646 547"; // 预处理:替换数字间的空格为下划线 $processed = preg_replace('/(\d) +(\d)/', '$1_$2', $string); // 统计单词,允许.、数字、下划线作为单词组成部分 $words = str_word_count($processed, 2, '.0123456789_'); // 还原占位符为空格 $words = array_map(function($item) { return str_replace('_', ' ', $item); }, $words); print_r($words); // 统计总数量直接用count($words)即可
如果原字符串本身包含下划线,可以把占位符替换为
#等其他不会出现的字符即可。
方案2:正则自定义匹配规则(更灵活)
不需要依赖str_word_count的内置规则,直接通过正则匹配你需要的统计单元,一步到位:
$string = "Patrick Kelly born in Italy. Tel. 654 646 547"; // 正则规则:匹配普通单词(含字母和点)/ 带空格的连续数字串 preg_match_all('/[A-Za-z.]+|\d+(?: +\d+)+/', $string, $matches); $words = $matches[0]; print_r($words); echo "总单词数:" . count($words);
如果需要调整单词允许的字符,直接修改正则里的字符组规则即可,适配性更高。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

