如何拆分逗号分隔字符串,忽略引号与括号内的逗号?
解决逗号分隔分组(忽略引号/括号内逗号)的问题
需求说明
需要将文本按逗号拆分为分组,但以下情况的逗号不作为分隔符:
- 逗号位于单引号(
')内部 - 逗号位于双引号(
")内部 - 逗号位于括号(
())内部
示例:
- 输入
a,b=456→ 拆分结果:['a', 'b=456'] - 输入
a='123,456',b→ 拆分结果:['a='123,456'', 'b'] - 输入
a=x(1,2,3),b,c→ 拆分结果:['a=x(1,2,3)', 'b', 'c']
问题现状
尝试过explode()、str_getcsv()、preg_split()等方法均无法得到正确结果,会误将引号/括号内的逗号当作分隔符。测试代码如下:
function test($n, $a,$b) { echo "Test $n"; if ( $a===$b ) echo "=<span style='color:green'>CORRECT ************************</span>"; else echo "=<span style='color:red'>WRONG</span>"; echo "<PRE>".print_r($b, true)."</PRE>"; echo "<HR> "; } $t= 'lorem ipsum=123,delor=\'1,456\',sit="123,456",amet=xxx(2,3),"consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."'; $want=["lorem ipsum=123","delor='1,456'","sit=\"123,456\"","amet=xxx(2,3)","consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."];
可行解决方案
通过自定义正则的preg_split()实现,核心思路是仅匹配不在未闭合引号/括号内的逗号作为分隔符。同时需要先将HTML实体的双引号(")转换为实际双引号,确保正则能正确识别。
完整代码示例:
function test($n, $a,$b) { echo "Test $n"; if ( $a===$b ) echo "=<span style='color:green'>CORRECT ************************</span>"; else echo "=<span style='color:red'>WRONG</span>"; echo "<PRE>".print_r($b, true)."</PRE>"; echo "<HR> "; } $t= 'lorem ipsum=123,delor=\'1,456\',sit="123,456",amet=xxx(2,3),"consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."'; $want=["lorem ipsum=123","delor='1,456'","sit=\"123,456\"","amet=xxx(2,3)","consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."]; // 先转换HTML实体的双引号为实际引号 $processed = htmlspecialchars_decode($t); // 使用正则拆分:匹配不在引号和未闭合括号内的逗号 $result = preg_split('/,(?=(?:[^"\']|["\'][^"\']*["\'])*$)(?=(?:[^()]*\([^()]*\))*[^()]*$)/', $processed); // 执行测试 test(1, $result, $want);
正则说明
,(?=(?:[^"\']|["\'][^"\']*["\'])*$):确保逗号后面的引号是成对闭合的,即逗号不在未闭合的单/双引号内(?=(?:[^()]*\([^()]*\))*[^()]*$):确保逗号后面的括号是成对闭合的,即逗号不在未闭合的括号内
内容的提问来源于stack exchange,提问作者abe1432181
相关产品推荐
相关产品推荐

