
本文介绍使用 PHP 原生函数(如 preg_replace 和 mb_ 系列)安全、准确地去除阿拉伯语字符串中连续重复的 Unicode 字符(如 "سسسللام" → "سلام"),避免 strlen/$string[$i] 导致的乱码问题,并提供可复用的健壮解决方案。
本文介绍使用 php 原生函数(如 `preg_replace` 和 `mb_` 系列)安全、准确地去除阿拉伯语字符串中**连续重复的 unicode 字符**(如 `"سسسللام"` → `"سلام"`),避免 `strlen`/`$string[$i]` 导致的乱码问题,并提供可复用的健壮解决方案。
处理阿拉伯语等 UTF-8 多字节语言时,直接使用 strlen() 和 $string[$i] 是危险且错误的——因为这些函数按字节而非字符操作,会导致截断 Unicode 编码(如一个阿拉伯字母占 2–3 字节),从而产生乱码或跳过字符,这也是原问题中“末尾字符失效”的根本原因。
✅ 正确做法是:使用 *`mb_` 多字节安全函数 或 Unicode 感知的正则表达式**。
✅ 推荐方案:preg_replace() + Unicode 属性(最简洁可靠)
<?php function removeConsecutiveDuplicates($str) {
// 匹配任意 Unicode 字母、数字、标点(含阿拉伯、波斯、乌尔都等)
// \p{L} = Letter, \p{N} = Number, \p{P} = Punctuation
// 使用 u 修饰符启用 UTF-8 模式
return preg_replace('/(\p{L}\p{M}*)\1+/u', '$1', $str);
}
// 测试阿拉伯语
$str = "سسسللام علييكمم";
echo removeConsecutiveDuplicates($str); // 输出:سلام عليكم
// 同样支持混合内容(含空格、标点)
echo removeConsecutiveDuplicates("مرحباا!! مرحباا..."); // 输出:مرحبا! مرحبا.
?>
? 说明:
- (\p{L}\p{M}*) 匹配一个 Unicode 字母(\p{L})及其可能的组合标记(如重音、元音符号 \p{M}),确保完整捕获带符号的阿拉伯字符(如 تَ, كِرَامٌ);
- \1+ 表示该捕获组后续连续重复一次及以上;
- $1 替换为单个原始字符,实现“去重留一”。
⚠️ 原方案为何失败?关键误区解析
// ❌ 危险写法(导致乱码和逻辑错误) for ($i = 0; $i
- strlen("سس") 返回 4(字节长度),但实际只有 2 个字符;
- $string[0] 取的是第一个字节(非完整字符),造成索引越界或截断;
- strpos() 在多字节字符串中同样不安全(应使用 mb_strpos())。
✅ 备选方案:mb_substr() 循环(更易理解,适合学习)
<?php function removeConsecutiveDuplicatesMb($str) {
$len = mb_strlen($str, 'UTF-8');
$ret = '';
for ($i = 0; $i < $len; $i++) {
$char = mb_substr($str, $i, 1, 'UTF-8');
// 只与前一个字符比较(连续去重),非全局去重
if ($i === 0 || $char !== mb_substr($ret, -1, 1, 'UTF-8')) {
$ret .= $char;
}
}
return $ret;
}
echo removeConsecutiveDuplicatesMb("سسسللام علييكمم"); // سلام عليكم
?>
? 注意:此方法实现的是连续重复字符压缩(如 "aaabbb" → "ab"),与正则方案行为一致;若需全局去重(所有重复字母仅保留首次出现),应改用 array_unique() 配合 mb_split(),但通常阿拉伯语场景需要的是「连续去重」以保持语义正确性(如 "الله" 不应变成 "اله")。
✅ 最终建议与注意事项
- 始终指定 'UTF-8' 编码参数:在 mb_* 函数中显式传入,避免依赖默认配置;
- 避免 shell 命令处理 Unicode:tr -s 'a-z' 仅适用于 ASCII,对阿拉伯语完全无效且存在注入风险(如 $str 含空格或引号);
- 测试边界情况:包含零宽连接符(ZWJ)、变体选择符(VS)或组合符号的文本,建议结合 Normalizer::normalize() 预处理;
- 性能提示:对于超长文本(>1MB),正则方案仍高效;循环方案时间复杂度 O(n),亦可接受。
掌握 UTF-8 安全的字符串操作,是处理阿拉伯语、中文、日文等多语言 Web 应用的基础能力。从今天起,请告别 strlen 和 $str[$i],拥抱 mb_ 与 \p{} —— 让你的代码真正“懂”世界语言。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











