php按破折号分割文本_php破折号分割preg_split法【步骤】
技术百科
星夢妙者
发布时间:2026-01-27
浏览: 次 preg_split默认保留空字符串,因连续分隔符间存在零长度子串;加PREG_SPLIT_NO_EMPTY可过滤;需注意中英文破折号Unicode差异,推荐用/[-–—―−]/u匹配并加/u修饰符。
preg_split 用破折号分割字符串时,为什么空字符串会进结果?
默认情况下 preg_split 不会自动过滤空项,比如 "a--b" 用 '/-/' 分割,结果是 ['a', '', 'b']。这不是 bug,是正则匹配的自然行为——两个连续破折号之间确实存在一个长度为 0 的子串。
解决方法很简单:加 PREG_SPLIT_NO_EMPTY 标志:
$parts = preg_split('/-/', $text, -1, PREG_SPLIT_NO_EMPTY);
- 不加该标志 → 保留所有分割结果,含空字符串
- 加了 → 自动跳过空项,更接近日常语义上的“分词”预期
- 注意:这个标志只影响空字符串,不处理前后空白,如需去空格得额外
array_map('trim', ...)
中文破折号、连接号、减号混用导致分割失败
常见误区是只写 '/-/',但实际文本中可能混着全角破折号(—)、en dash(–)、em dash(—)、甚至中文顿号或减号(−)。它们 Unicode 码位不同,正则不会匹配。
稳妥做法是显式列出常用变体:
$pattern = '/[-–—―−]/u'; // 支持 ASCII 减号、en dash、em dash、全角连接号、Unicode 减号
-
/u修饰符必须加,否则 UTF-8 中文破折号会匹配失败或乱码 - 如果确定全是 ASCII 环境(如日志字段),可简化为
'/-/',但上线前务必检查原始数据来源 - 用
mb_ereg_replace或str_replace预处理统一成一种再分割,有时比写复杂正则更稳
分割后要保留分隔符?用捕获组 + PREG_SPLIT_DELIM_CAPTURE
默认 preg_split 丢弃分隔符。如果需要像 "a-b-c" → ['a', '-', 'b', '-', 'c'] 这样保留破折号本身,得靠捕获组和标志配合:
$parts = preg_split('/(-)/u', $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
- 括号把
-包成捕获组,PREG_SPLIT_DELIM_CAPTURE让它也进结果数组 - 仍建议加上
PREG_SPLIT_NO_EMPTY,避免因开头结尾是破折号产生空项 - 注意:如果用了多个不同分隔符(如
[-–—]),捕获组会把实际匹配到的那个字符原样返回,适合做后续类型判断
性能敏感场景下,别硬上 preg_split
如果只是简单按 ASCII 破折号切分,且确认输入无 Unicode 异常,

explode('-', $text) 比 preg_split 快 3–5 倍,内存占用更低。
-
explode不支持正则,不能处理多种破折号变体,也不能保留分隔符 - 若需去空、trim、过滤空项,组合
array_filter(array_map('trim', explode('-', $text)))依然比正则快 - 真正要用
preg_split的典型场景只有两个:需要多字符/多形态分隔符,或必须保留分隔符本身
线上高频调用的接口里,先 mb_strpos($text, '–') 判断是否存在非 ASCII 破折号,再决定走 explode 还是 preg_split,是个实用的平衡点。
# 是个
# 用了
# 多个
# 解决方法
# 多字
# 很简单
# 内存占用
# 字符串
# 接口
# 为什么
# bug
# ASCII
# 空字符串
# php
# 分隔符
# 切分
# 全角
# 修饰符
# dash
相关栏目:
<?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; ?>
】
相关推荐
- Mac如何解压zip和rar文件?(推荐免费工具)
- php下载安装后memory_limit怎么设置_
- c# 在高并发下使用反射发射(Reflection
- PHP cURL GET请求:正确设置认证与自定义
- php订单日志怎么按金额排序_php按订单金额排序
- MAC怎么设置程序窗口永远最前_MAC窗口置顶插件
- Drupal 中 HTML 链接被双重转义导致渲染
- Win11怎么关闭用户账户控制UAC_Window
- Windows10如何更改鼠标图标_Win10鼠标
- Linux怎么设置磁盘配额_Linux系统Quot
- Win11怎么开启自动HDR画质_Windows1
- 如何在Golang中实现WebSocket广播_使
- Win11怎么格式化U盘_Win11系统U盘格式化
- 微信里的php文件怎么变mp4_微信接收php转m
- 如何使用Golang encoding/json解
- 如何在Golang中配置代码格式化工具_使用gof
- 为什么本地php环境运行php脚本卡顿_php执行
- c++的static关键字有什么用 静态变量和静态
- 如何在 Go 中调用动态链接库(.so)中的函数
- 如何在Golang中解压文件_Golang com
- php485在php5.6下能用吗_php485旧
- Linux如何申请SSL免费证书_Linux下Ce
- php怎么下载安装后无法解析php文件_服务器配置
- php485函数执行慢怎么优化_php485性能提
- Win11如何设置环境变量 Win11添加和修改系
- 如何使用正则表达式批量替换重复的星号-短横模式为固
- Win11怎么开启窗口对齐助手_Windows11
- Win11怎么查看wifi信号强度_检测Windo
- PHP主流架构怎么部署到Docker_容器化流程【
- Python模块的__name__属性如何由导入方
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- Win11怎么关闭小组件_Win11禁用任务栏天气
- c++中的Tag Dispatching是什么_c
- Win11任务栏怎么调到左边_Win11开始菜单居
- Mac如何创建和管理多个桌面空间_Mac高效多任务
- 如何理解Go指针和内存分配关系_Go Pointe
- Win11开机速度慢怎么优化_Win11系统启动加
- Python迭代器生成器进阶教程_节省内存与懒加载
- Win11如何设置系统声音_Win11系统声音调整
- Win11文件夹预览图不显示怎么办_Win11缩略
- Win11怎么禁用键盘自带键盘_Win11笔记本禁
- windows如何禁用驱动程序强制签名_windo
- 如何使用Golang搭建本地API测试环境_快速验
- Go语言中slice追加操作的底层共享机制详解
- Mac如何与安卓手机传文件_Mac和Android
- 如何在Golang中处理模块冲突_解决依赖版本不兼
- Mac自带的词典App怎么用_Mac添加和使用多语
- MAC如何隐藏文件夹及文件_MAC终端命令隐藏与第
- 如何在Golang中操作嵌套切片指针_Golang
- Windows怎样拦截QQ浏览器广告_Window

QQ客服