
本文介绍使用正则表达式高效解析形如 (key)value(next_key)next_value 的动态字符串,提取出以括号内内容为键、后续非括号文本为值的关联数组,并提供可直接运行的代码及关键注意事项。
本文介绍使用正则表达式高效解析形如 `(key)value(next_key)next_value` 的动态字符串,提取出以括号内内容为键、后续非括号文本为值的关联数组,并提供可直接运行的代码及关键注意事项。
要从类似 (parent)item category(child)master data(name)category 的动态字符串中构建 ["parent" => "item category", "child" => "master data", "name" => "category"] 这样的关联数组,核心在于精准分割“键”与“对应值”的边界:每个键位于圆括号 () 内,其值是从该右括号 ) 开始、到下一个左括号 ( 之前的所有字符(不含括号本身)。
推荐使用 preg_match_all() 配合捕获组实现一次性提取:
<?php
$input = "(parent)item category(child)master data(name)category";
// 正则说明:
// (([^()]+)) → 匹配左括号 + 一个或多个非括号字符 + 右括号;$matches[1] 存键
// ([^()]+) → 紧跟其后匹配一段不含括号的字符串;$matches[2] 存值
preg_match_all('/(([^()]+))([^()]+)/', $input, $matches);
// 将第1组(键)和第2组(值)合并为关联数组
$result = array_combine($matches[1], $matches[2]);
print_r($result);
// 输出:
// Array
// (
// [parent] => item category
// [child] => master data
// [name] => category
// )
?>✅ 关键点说明:
- 正则
/\(([^()]+)\)([^()]+)/显式排除括号字符,确保不会跨段匹配(例如避免将(a)text(b)中的text(b)整体误作值); -
array_combine()要求两个数组长度一致且无重复键——因此该方案要求输入中所有括号内键名唯一且结构严格合规; - 若字符串以括号结尾(如
... (name)),末尾无对应值,则该键不会被捕获(因第二组([^()]+)无法匹配空内容)。
⚠️ 注意事项:
立即学习“PHP免费学习笔记(深入)”;
- 该方法适用于结构简单、括号不嵌套、键值间无干扰括号的场景;
- 若输入可能含嵌套括号(如
(config)(host)api(ports)(80,443))或值中含括号(如(desc)user (admin) role),正则将失效,此时应改用状态机逐字符解析或引入轻量级语法分析器; - 生产环境建议增加健壮性检查:
if (count($matches[1]) !== count($matches[2])) { throw new InvalidArgumentException('Mismatched keys and values in input string.'); }
综上,此正则方案简洁高效,是处理规则明确、格式受控的键值对字符串的理想选择。



















