如何解析含内嵌逗号的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
相关产品推荐
相关产品推荐

