如何使用preg_split实现预期拆分?保留姓名不被拆分
解决方案:保留姓名空格的字符串拆分问题
哈哈,这个坑我踩过!你用preg_split('/[-, ]+/',$string)的时候,所有空格(包括姓名里的)都会被当成分隔符,自然把BARUN SINHA拆成两个元素了。要解决这个问题,核心是区分需要拆分的分隔符和姓名里要保留的空格,下面给你两个实用方案:
方案1:基于固定字段位置拆分(最直接)
从你的输入格式来看,字段顺序是固定的:
- 序号 → 2. BDP前缀+数字(带连字符) → 3. 数字码 → 4. 姓名(两个单词) → 5. 后续的单个代码
这种情况用explode结合数组操作最稳妥,不需要复杂正则:
$string = "1 BDP-105159857 2602 BARUN SINHA MTE02 MTE07 MTE08 PHE11 PHE14"; // 第一步:按空格拆分初始数组 $initialParts = explode(' ', $string); // 第二步:拆分BDP前缀和数字 list($bdpPrefix, $bdpNum) = explode('-', $initialParts[1]); // 第三步:合并姓名(BARUN + 空格 + SINHA) $fullName = $initialParts[3] . ' ' . $initialParts[4]; // 第四步:组装最终结果数组 $result = [ $initialParts[0], // 1 $bdpPrefix, // BDP $bdpNum, // 105159857 $initialParts[2], // 2602 $fullName, // BARUN SINHA ...array_slice($initialParts, 5) // 后续所有代码:MTE02, MTE07... ]; // 打印结果验证 print_r($result);
输出结果完全符合你的需求:
Array ( [0] => 1 [1] => BDP [2] => 105159857 [3] => 2602 [4] => BARUN SINHA [5] => MTE02 [6] => MTE07 [7] => MTE08 [8] => PHE11 [9] => PHE14 )
方案2:正则匹配(适合格式有变动的场景)
如果你的输入格式偶尔会有小变化(比如姓名位置不固定,但姓名是唯一包含空格的字段,或者后续代码都是MTExx/PHExx格式),可以用正则直接匹配所有需要的元素:
$string = "1 BDP-105159857 2602 BARUN SINHA MTE02 MTE07 MTE08 PHE11 PHE14"; // 正则匹配规则:覆盖所有需要的字段,把姓名作为一个整体捕获 $pattern = '/(\d+) (BDP)-(\d+) (\d+) ([A-Z]+ [A-Z]+) ((?:MTE\d+|PHE\d+)(?: |$))+/'; preg_match($pattern, $string, $matches); // 整理结果:前面5个捕获组是固定字段,最后一个捕获组拆分后是后续代码 $codes = array_filter(explode(' ', $matches[6])); // 过滤空元素 $result = [ $matches[1], $matches[2], $matches[3], $matches[4], $matches[5], ...$codes ]; print_r($result);
这个方案的优势是容错性更强,只要姓名是两个大写单词、后续代码符合格式,就能正确拆分。
内容的提问来源于stack exchange,提问作者Asim Das
相关产品推荐
相关产品推荐

