You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解析含内嵌逗号的key=value字符串为PHP关联数组?

解决带逗号值的字符串转关联数组问题

你的问题核心在于值中包含逗号,直接用explode(",")会把Name的值拆成两个独立元素,导致无法正确解析键值对。这里提供两种可靠的解决方案:

方法一:正则匹配完整键值对

利用正则表达式精准匹配每个键=值组合,忽略值内部的逗号。正则会识别出分隔键值对的, 键=模式,从而避免误分割值里的逗号。

$str = "ProductId=123, Name=Ancient Roots, Modern Pursuits, Country=India, City=Bangalore, Price=3368";

// 匹配所有键值对:键是单词,值是直到下一个", 键="或字符串结尾的内容
preg_match_all('/(\w+)=([^=]+?)(?=, \w+=|$)/', $str, $matches);

// 将匹配结果组合成关联数组,同时去除值两侧的空格
$product = array_combine($matches[1], array_map('trim', $matches[2]));

print_r($product);

正则说明:

  • (\w+):匹配键名(比如ProductId、Name),仅匹配字母数字下划线
  • =:匹配键和值之间的分隔符
  • ([^=]+?):非贪婪匹配值内容(避免过度匹配到下一个键值对),直到遇到后续的, 键=或字符串结尾
  • (?=, \w+=|$):正向预查,确保分割点是下一个键值对的开头或字符串末尾

方法二:精准分割键值对元素

先用preg_split仅在, 键=的位置分割字符串,得到完整的键=值元素,再逐个分割键和值。

$str = "ProductId=123, Name=Ancient Roots, Modern Pursuits, Country=India, City=Bangalore, Price=3368";

// 仅在", 键="的位置分割,保留值内部的逗号
$parts = preg_split('/, (?=\w+=)/', $str);

$product = [];
foreach ($parts as $part) {
    // 只分割第一个等号,确保值里的等号(如果有的话)不会被分割
    list($key, $value) = explode('=', $part, 2);
    $product[trim($key)] = trim($value);
}

print_r($product);

关键细节:

  • preg_split('/, (?=\w+=)/', $str):分割符是逗号+空格,且后面必须跟着单词=,这样就不会误分割值里的逗号(比如Ancient Roots, Modern Pursuits里的逗号后面是空格,但不是单词=)
  • explode('=', $part, 2):第三个参数2限制只分割一次,确保值内容的完整性

两种方法都能得到你想要的结果:

Array
(
    [ProductId] => 123
    [Name] => Ancient Roots, Modern Pursuits
    [Country] => India
    [City] => Bangalore
    [Price] => 3368
)

内容的提问来源于stack exchange,提问作者Bharat Godam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:54:29