
本文介绍一种使用正则表达式高效解析形如 (key)value(...) 结构字符串的方法,将其转换为关联数组,适用于动态配置、轻量级 DSL 解析等场景。
本文介绍一种使用正则表达式高效解析形如 `(key)value(...)` 结构字符串的方法,将其转换为关联数组,适用于动态配置、轻量级 dsl 解析等场景。
在 PHP 开发中,我们常需从结构化但非标准格式的字符串中提取键值对。例如,给定字符串 (parent)item category(child)master data(name)category,目标是将每对 (...) 中的内容作为数组键,其后紧跟、且在下一个 ( 之前的内容作为对应值,最终生成:
["parent" => "item category", "child" => "master data", "name" => "category"]
核心思路是匹配“左括号 + 键名 + 右括号 + 值内容”这一连续模式,并确保值内容不跨越下一个括号边界。以下为推荐实现:
<?php
$input = "(parent)item category(child)master data(name)category";
// 正则说明:
// \(([^()]+)\) → 匹配左括号、非括号字符组成的键名、右括号;捕获键名为 $matches[1]
// ([^()]+) → 匹配紧接着的、不含括号的任意字符(即值);捕获为 $matches[2]
preg_match_all('/\(([^()]+)\)([^()]+)/', $input, $matches);
// 将捕获的键组与值组合并为关联数组
$result = array_combine($matches[1], $matches[2]);
print_r($result);
// 输出:
// Array
// (
// [parent] => item category
// [child] => master data
// [name] => category
// )
?>✅ 关键点说明:
-
[^()]+确保键和值均不包含括号,避免跨段误匹配,适用于大多数简单场景; -
preg_match_all全局匹配所有符合模式的片段,天然支持动态长度与任意数量的键值对; -
array_combine()要求两数组长度一致且键唯一——因此输入中键名必须互异,否则将触发警告并返回false。
⚠️ 注意事项与局限性:
立即学习“PHP免费学习笔记(深入)”;
- 该方案不支持嵌套括号或值中含括号(如
(tag)text(with)parentheses),此时正则会提前截断; - 若输入可能含空键(如
()value)或空值(如(key)),需额外校验$matches[1]和$matches[2]长度及内容有效性; - 对于高复杂度语法(如带转义、嵌套、注释等),建议升级为状态机解析器或采用专用配置格式(如 JSON/YAML)。
总之,此正则方案简洁高效,是处理轻量级自定义标记字符串的理想选择——只要语义清晰、结构扁平,它就能可靠工作。



















