
本文详解如何用 php 的 `preg_replace()` 高效替换数组中所有形如 `*-*-*-*` 的不定长重复模式为 `***`,重点解析正则逻辑、常见误区及一行式批量处理技巧。
在实际开发中,我们常需清理或标准化含规律性符号组合的文本(如 *-*-*-*、+-+--+ 等)。本例中,目标是将任意长度(≥3组)的 *-*-*...* 模式统一替换为 ***,且需对整个字符串数组批量处理。
关键在于准确描述模式结构:它并非“多个 * 或 - 的混合”,而是严格交替的 * 后跟 -,并以 * 结尾——即 *-*-*-* 可拆解为 (*-) 重复若干次,再加一个末尾 *。因此正则应写作:
$result = preg_replace('/(\*-){3,}\*/', '***', $rows);✅ 正确解析:
- (\*-):捕获组,匹配字面量 * 后紧跟 -(注意 * 在字符类外需转义为 \*);
- {3,}:要求该组至少连续出现 3 次(对应最小模式 *-*-*);
- \*:匹配结尾的单独 *(例如 *-*-* → 2 组 (\*-) + 1 个 \*;*-*-*-* → 3 组 (\*-) + 1 个 \*)。
❌ 常见错误剖析:
- [\*\-]{3,} 匹配的是「任意 3 个及以上 * 或 - 字符」,如 **-、---、*- 都会命中,完全偏离目标;
- 忽略 * 的转义(如写成 *-)会导致正则语法错误(* 是量词,需 \* 表示字面量);
- 对数组逐元素 foreach 处理虽可行,但低效;preg_replace() 原生支持数组输入,直接返回新数组,更简洁安全。
完整可运行示例:
$rows = [
'Blah *-*-*-*-*-*-*-* Blah',
'Blah *-*-*-*-*-*-*-*-* Blah',
'Blah *-*-*-*-*-*-*-*-*-*-*-*-* Blah',
];
$result = preg_replace('/(\*-){3,}\*/', '***', $rows);
print_r($result);
// 输出:
// Array (
// [0] => Blah *** Blah
// [1] => Blah *** Blah
// [2] => Blah *** Blah
// )⚠️ 注意事项:
- 若原始字符串中存在其他 * 或 - 组合(如 *-x-*),该正则不会误匹配,因其严格要求 *- 连续出现 + 末尾 *;
- 如需匹配「至少 2 组」(即最短 *-*-),将 {3,} 改为 {2,} 即可;
- 替换操作不修改原数组 $rows,始终返回新数组,符合函数式编程习惯。
总结:掌握「结构化重复模式」的正则写法((...){n,} + 边界字符)比泛化字符类更精准;善用 preg_replace() 的数组能力,可大幅提升代码简洁性与可维护性。










