PHP 7.3无内置字符串去重函数,但可实现相邻重复字符去除(如"aaabbbcc"→"abc")和全量去重保留首次出现顺序(如"abacbd"→"abcd"),分别用preg_replace和str_split+array_unique组合完成。

PHP 7.3 中没有内置的“字符串去重”函数,但可以通过组合现有函数实现两种常见需求:一是去除字符串中**相邻重复字符**(如 "aaabbbcc" → "abc"),二是去除字符串中**所有重复字符,只保留首次出现的**(如 "abacbd" → "abcd")。下面分别说明实现方式。
去除相邻重复字符(类似 Unix 的 uniq)
适用于已排序或天然连续重复的字符串,例如压缩日志、简化标记序列等。
使用 preg_replace() 正则匹配连续相同字符:
$str = "aaabbbcccdde";
$result = preg_replace('/(.)\1+/', '$1', $str);
// 输出: "abcde"
说明:(.) 捕获任意单个字符,\1+ 匹配该字符后续一个或多个重复,整体替换成捕获的第一个字符。
立即学习“PHP免费学习笔记(深入)”;
去除全部重复字符,保留首次出现顺序
这是更常见的“去重”需求,本质是提取字符串中不重复的字符并保持原始顺序。
推荐方法:转为字符数组 → 去重 → 合并回字符串:
$str = "abacbd";
$chars = str_split($str); // ['a','b','a','c','b','d']
$unique = array_values(array_unique($chars)); // ['a','b','c','d']
$result = implode('', $unique); // "abcd"
注意:array_unique() 在 PHP 7.3 中对字符串数组完全支持,且保留键名顺序(array_values() 仅用于重置索引,非必需但更规范)。
区分大小写与特殊字符处理
上述方法默认区分大小写("Aa" 视为不同字符)。如需忽略大小写去重,可先统一转小写再处理,但要注意最终结果应保留首次出现的原始大小写形式:
- 先遍历字符串,用
isset()手动记录已见字符(区分大小写存储键名) - 对每个字符检查其小写形式是否已存在,未存在则加入结果并标记
$str = "AbBcCda";
$seen = [];
$result = '';
foreach (str_split($str) as $char) {
$lower = strtolower($char);
if (!isset($seen[$lower])) {
$seen[$lower] = true;
$result .= $char;
}
}
// 输出: "AbCda"
性能与边界提醒
对超长字符串(如 >10MB),str_split() 可能触发内存限制。此时建议逐字节读取处理,或改用正则(仅限相邻去重)。
空字符串、ASCII/UTF-8 字符均兼容 —— 但若含多字节 UTF-8 字符(如中文),str_split() 在 PHP 7.3 默认按字节切分,可能导致乱码。此时应改用 mb_str_split($str)(需启用 mbstring 扩展):
// 支持中文
$chinese = "你好世界你好";
$chars = mb_str_split($chinese); // PHP 7.3+
$unique = array_unique($chars);
$result = implode('', $unique); // "你好世界"



















