PHP 字符串分组算法实现

字符串分组有四类方法:一是str_split按固定长度切分;二是preg_split用正则按分隔符(含保留分隔符)切分;三是结合mb_substr按中文/英文等语义边界切分;四是按相同字符连续出现动态分组。

PHP 字符串分组算法实现

按固定长度分组字符串

最常见需求是把长字符串按每 n 个字符切分成若干子串。PHP 内置函数 str_split() 可直接实现:

  • str_split($str, 3) 将字符串每 3 个字符一组,返回数组
  • 若未指定长度,默认按单字符拆分;长度为 0 或负数会报错
  • 末尾不足长度的部分自动作为最后一组(不补空格)

按指定分隔符分组(非简单 explode)

当需要保留分隔符、或按复杂规则(如“遇到数字就切”)分组时,explode() 不够用。可用 preg_split() 配合正则:

  • preg_split('/(d+)/', $str, -1, PREG_SPLIT_DELIM_CAPTURE) 按数字切,并保留数字本身
  • PREG_SPLIT_NO_EMPTY 可跳过空结果
  • 适合处理日志、协议报文等含结构化标记的字符串

按语义边界分组(如中文词/英文单词)

纯按字节或正则难处理混合文本。可结合 mb_substr() 和自定义逻辑:

  • 遍历字符串,用 mb_substr($str, $i, 1, 'UTF-8') 逐字判断是否为汉字、字母、标点
  • 设定规则:连续字母归一组,连续汉字归一组,标点单独成组
  • 注意 UTF-8 下 strlen() 不能用于中文计数,必须用 mb_strlen()

按内容特征动态分组(如相同字符连续出现)

类似 RLE(行程编码)的分组,把相邻相同字符合并为一组:

立即学习PHP免费学习笔记(深入)”;

  • 初始化空数组,遍历字符串,比较当前字符与上一个
  • 相同时追加到当前组;不同时新建一组
  • 示例:"aaabbbcc"['aaa','bbb','cc']
  • 一行写法可用 preg_match_all(‘/(.)1*/’, $str, $matches) 直接捕获

实际使用时,先明确分组依据:是位置、符号、语义还是模式?再选对应方法。内置函数优先,复杂逻辑再手写循环。