php分割文本去除重复分隔符_php先去重分隔符再分割【技巧】
技术百科
雪夜
发布时间:2026-01-27
浏览: 次 PHP中explode()遇连续分隔符会产生空元素,应先用preg_split('/[,|]+/', $text, -1, PREG_SPLIT_NO_EMPTY)归一化分割,或循环str_replace预处理后再explode并array_filter(..., 'strlen')。
PHP 处理文本时,如果分隔符连续出现(比如 "a,,b" 或 "x|||y"),直接用 explode() 会产生空字符串元素。这不是“去重”,而是要先归一化分隔符——把多个连续分隔符压缩成一个,再分割。
为什么 explode() 会留下空数组项
因为 explode() 是按字面切分,不跳过重复分隔符。例如:
var_dump(explode(',', 'a,,b')); // ['a', '', 'b']
这在后续遍历或 array_filter() 时容易出错,尤其当业务逻辑依赖非空值顺序时。
- 连续分隔符被当作独立切点,产生中间空段
-
explode()不做任何预处理,纯机械切割 - 若分隔符是正则字符(如
.、|、+),未转义还会报错
用 preg_split() 一步到位:跳过多余分隔符
正则方式最简洁,用 + 量词匹配“一个及以上连续分隔符”,并开启 PREG_SPLIT_NO_EMPTY 标志过滤空项:
$text = 'apple,,,banana|||cherry';
$result = preg_split('/[,|]+/', $text, -1, PREG_SPLIT_NO_EMPTY);
// ['apple', 'banana', 'cherry']
- 分隔符是普通字符时,直接写进字符组
[,|];含正则元字符(如.、*)需用\.转义 -
-1表示不限制分割次数,避免截断 - 必须加
PREG_SPLIT_NO_EMPTY,否则仍可能有空字符串
不用正则?用 str_replace() 预处理再 explode()
适合分隔符简单且固定(如只用逗号),或运行环境禁用 PCRE 扩展:
$text = str_replace(',,', ',', $text);
$text = str_replace(',,', ',', $text); // 多跑几遍不保险,改用 while
while (strpos($text, ',,') !== false) {
$text = str_replace(',,', ',', $text);
}
$result = array_filter(explode(',', $text), 'strlen');
- 单次
str_replace()只能消掉相邻一对,无法处理',,,'→ 需循环或改用preg_replace
()
-
array_filter(..., 'strlen')比array_filter(...)更安全,避免把'0'当 false 过滤掉 - 性能上不如
preg_split()一次到位,尤其长文本+高频调用时
注意分隔符本身含特殊字符的场景
比如用竖线 | 分割,但没放进字符组或没转义,会导致正则语法错误:
// ❌ 错误:| 是正则“或”操作符
preg_split('/|/', $text);
// ✅ 正确:转义或放进字符组
preg_split('/\|/', $text);
preg_split('/[|]/', $text);
- 斜杠
/、点.、星号*、加号+、问号?等都要转义 - 用字符组
[...]包裹更直观,多数元字符在里面失去特殊含义(除^、-、]等少数) - 如果分隔符是变量内容(如用户输入),必须用
preg_quote($sep, '/')安全转义
真正麻烦的不是怎么切,而是分隔符来源不可控——比如来自 CSV 解析、日志行或表单提交。这时候提前判断是否含连续分隔符、是否需要保留原始结构,比硬套技巧更重要。
# 还会
# 多个
# 都要
# 跳过
# app
# 运行环境
# 循环
# 字符串
# 为什么
# 空字符串
# php
# 遍历
# csv
# apple
# 这不是
# 表单提交
# 分隔符
# 切分
# strlen
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- 如何在Windows上设置闹钟和计时器_系统自带的
- Windows10如何更改盘符名称_Win10重命
- VSC怎么创建PHP项目_从零开始搭建项目的步骤【
- Win11怎么关闭透明效果_Windows11个性
- Windows蓝屏错误0x0000001E怎么修复
- windows如何禁用驱动程序强制签名_windo
- Python项目回滚策略_发布安全说明【指导】
- windows系统如何安装cab更新补丁_wind
- Win11怎么激活Windows10_Win11激
- 获取 PHP 文件最后修改时间的正确方法
- Linux如何使用Curl发送请求_Linux下A
- Mac如何查看电池健康百分比_Mac系统信息电源检
- mac怎么安装pip_MAC Python pip
- Win11任务栏怎么放到顶部_Win11修改任务栏
- Go 语言标准库为何不提供泛型切片的 Contai
- 如何在Golang中实现RPC异步返回_Golan
- 如何在 Go 中正确反序列化 XML 多节点数组(
- Win11麦克风没声音怎么设置_Win11麦克风权
- Mac怎么设置登录项_Mac管理开机自启动程序【教
- Win11怎么关闭系统透明度_Windows11个
- 手机php怎么转mp4_手机端php文件转mp4a
- Win11怎么开启空间音效_Windows11耳机
- 如何使用Golang table-driven基准
- 如何关闭Win10自动更新更新_Win10系统自动
- PHP 中如何在函数内持久修改引用变量所指向的目标
- windows如何测试网速_windows系统网络
- Win11怎么关闭定位服务_保护Win11位置隐私
- MySQL 中使用 IF 和 CASE 实现查询字
- 如何在 VS Code 中正确配置并使用 NumP
- Windows笔记本无法进入睡眠模式怎么办?(电源
- 如何使用Golang实现负载均衡_分发请求到多个服
- Golang如何测试HTTP中间件_Golang
- Win11如何设置文件关联 Win11修改特定文件
- Win11怎么开启远程桌面连接_Windows11
- 如何更改Windows资源管理器的默认启动位置?(
- Win10如何更改网络连接_Windows10以太
- Win11怎么设置开机自动连接宽带_Windows
- PHP中require语句后直接调用返回对象方法的
- Win11如何关闭游戏模式 Win11禁用Xbox
- Win11怎么查看局域网电脑_Windows 11
- 如何使用Golang benchmark测量函数延
- Win11怎么退出微软账户_切换Win11为本地账
- MySQL 中使用 IF 和 CASE 实现查询字
- XSLT怎么生成动态的HTML属性名和标签名
- Windows10电脑怎么查看硬盘通电时间_Win
- Win10怎样卸载iTunes_Win10卸载iT
- Win11如何设置环境变量 Win11添加和修改系
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- Win11怎么设置任务栏大小_Windows11注
- 如何使用Golang捕获测试日志_Golang t


QQ客服