
本文详解如何基于双下划线 __ 和单下划线 _ 的混合分隔规则,精准拆分类似 kronobergslan_Preem_AlmhultS_Esplanaden__diesel 的字符串,提取出四个语义明确的字段,并提供健壮、可复用的 PHP 实现方案。
本文详解如何基于双下划线 `__` 和单下划线 `_` 的混合分隔规则,精准拆分类似 `kronobergslan_preem_almhults_esplanaden__diesel` 的字符串,提取出四个语义明确的字段,并提供健壮、可复用的 php 实现方案。
该问题本质是带结构语义的字符串解析任务:输入字符串使用 _ 作为基础分隔符,但其中 __(双下划线)具有特殊含义——它标记最后一个字段(如 diesel)的起始位置;而中间部分(即第一个 _ 后、__ 前的所有 _ 连接片段)需合并为一个逻辑字段(如 AlmhultS_Esplanaden → Almhult S Esplanaden),且需保留原始空格语义或按驼峰/大小写规则智能分词。
直接 explode('_', $str) 会导致 __ 被拆成空元素(如 ['...', '', 'diesel']),破坏结构。因此,核心策略是先定位 __,将其视为不可分割的边界锚点,再分段处理。
以下是推荐的清晰、可维护的解决方案:
public function filter(string $call): array
{
// 步骤1:以 '__' 为界,将字符串严格分为两部分
$parts = explode('__', $call, 2);
if (count($parts) !== 2) {
throw new InvalidArgumentException("Input must contain exactly one '__' separator");
}
$prefix = $parts[0]; // 如 'kronobergslan_Preem_AlmhultS_Esplanaden'
$suffix = $parts[1]; // 如 'diesel'
// 步骤2:对 prefix 按 '_' 拆分,取前两项为独立字段
$prefixParts = explode('_', $prefix);
if (count($prefixParts) $a,
'b' => $b,
'c' => $c,
'd' => $d
];
}
✅ 关键设计说明:
- explode('__', $str, 2) 保证只分割一次,避免误拆 __ 中间可能存在的 _;
- array_slice($prefixParts, 2) 安全提取所有中间段,无需硬编码索引判断;
- 正则分词 /(? 能准确识别驼峰式连写(如 VaxjoSodra → Vaxjo Sodra,AlmhultS → Almhult S),比简单 ucfirst() + preg_split 更鲁棒;
- 所有异常路径均显式抛出,便于调试与维护。
⚠️ 注意事项:
- 避免在循环中修改数组长度后仍用原 count() 迭代(如原代码 unset($parts[$count]-1) 语法错误且逻辑混乱);
- 单引号 ' 优于双引号 "(无变量插值时),提升性能与可读性;
- 不要依赖 ucfirst() 对整个数组批量处理——它会错误地将 Preem 变成 Preem(本已正确),却把 almhults 错误转为 Almhults(而实际应为 Almhult S);
- 示例中 Circle_K 应合并为 Circle K,本方案通过 $b = $prefixParts[1] + 后续对 $c 的剥离自然支持(Circle_K_Vaxjo... → $b='Circle', $c='K Vaxjo...',若需合并 Circle K,可在 $b 提取后检查 $prefixParts[2] === 'K' 并手动拼接)。
此方法逻辑清晰、边界明确、易于扩展,真正教会你「先识别结构锚点,再分层解析」的字符串处理范式。











