preg_split默认保留空字符串,因连续分隔符间存在零长度子串;加PREG_SPLIT_NO_EMPTY可过滤;需注意中英文破折号Unicode差异,推荐用/[-–—―−]/u匹配并加/u修饰符。

php按破折号分割文本_php破折号分割preg_split法【步骤】

preg_split 用破折号分割字符串时,为什么空字符串会进结果?

默认情况下 preg_split 不会自动过滤空项,比如 "a--b"'/-/' 分割,结果是 ['a', '', 'b']。这不是 bug,是正则匹配的自然行为——两个连续破折号之间确实存在一个长度为 0 的子串。

解决方法很简单:加 PREG_SPLIT_NO_EMPTY 标志:

$parts = preg_split('/-/', $text, -1, PREG_SPLIT_NO_EMPTY);

中文破折号、连接号、减号混用导致分割失败

常见误区是只写 '/-/',但实际文本中可能混着全角破折号(—)、en dash(–)、em dash(—)、甚至中文顿号或减号(−)。它们 Unicode 码位不同,正则不会匹配。

稳妥做法是显式列出常用变体:

$pattern = '/[-–—―−]/u'; // 支持 ASCII 减号、en dash、em dash、全角连接号、Unicode 减号

分割后要保留分隔符?用捕获组 + 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

如果只是简单按 ASCII 破折号切分,且确认输入无 Unicode 异常,explode('-', $text)preg_split 快 3–5 倍,内存占用更低。

线上高频调用的接口里,先 mb_strpos($text, '–') 判断是否存在非 ASCII 破折号,再决定走 explode 还是 preg_split,是个实用的平衡点。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。