正则表达式是php字符串去重最轻量方案,仅压缩相邻重复字符;需加/u修饰符并用\p{l}支持unicode;默认忽略空格标点,如需包含可用/(.)\1+/u。

PHP字符串去重,正则表达式是最轻量、最直接的方案之一,尤其适合处理“连续重复字符”(如 aaabbbcc → abc)这类高频场景。它不依赖数组转换,执行快、代码短,但要注意:它默认只去**相邻重复**,不是全局去重。
正则去重的核心写法
一行搞定连续重复字符压缩:
$str = "aaabbbcccdde";
$result = preg_replace('/(.)\1+/', '$1', $str);
// 输出:abcde
说明:
-
(.)捕获任意单个字符(除换行符外) -
\1+表示该捕获字符紧接着又出现一次或多次 -
$1在替换中代表第一次匹配到的那个字符,实现“多→一”
支持中文、阿拉伯语等 Unicode 字符
默认正则对 UTF-8 多字节字符(如汉字、阿拉伯字母)可能出错。必须加 /u 修饰符,并改用 Unicode 属性类:
$str = "你好你好世界世界";
$result = preg_replace('/(\p{L})\1+/u', '$1', $str);
// 输出:你好世界
关键点:
-
\p{L}匹配任意 Unicode 字母(含中、日、韩、阿、俄等) -
/u启用 UTF-8 模式,确保按字符而非字节解析 - 避免用
strlen()或$str[0]直接操作,否则会切碎中文/阿拉伯字符
去重但保留空格、标点和换行
如果字符串含空格、逗号、句号、换行等非字母符号,且你只想压缩字母类重复,上面的 \p{L} 已自动做到——它只匹配文字字符,忽略其他。
若需同时处理数字或所有字符(包括空格),可改用:
// 压缩所有连续重复字符(含空格、数字、标点)
$result = preg_replace('/(.)(?
<p>不过 <code>[\s\S]</code> 会连换行也压缩,实际更推荐明确范围,例如:</p>
- 只处理字母+数字:
/([\p{L}\p{N}])\1+/u - 保留空格但压缩连续空格:
/ +/u单独替换为' '
注意:这不是全局去重
正则 /(.)\1+/ 只解决“挨着的重复”,比如:
-
"abac"→ 不变(a 不连续,所以不去) -
"aabbcc"→"abc"(连续才生效)
若要真正“全字符串去重”(每个字符只留第一次出现),得用数组方式:implode('', array_unique(str_split($str)))。
正则做不到这个效果,别强行套用。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











