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

如何拆分逗号分隔字符串,忽略引号与括号内的逗号?

解决逗号分隔分组(忽略引号/括号内逗号)的问题

需求说明

需要将文本按逗号拆分为分组,但以下情况的逗号不作为分隔符:

  • 逗号位于单引号(')内部
  • 逗号位于双引号(")内部
  • 逗号位于括号(())内部

示例:

  1. 输入a,b=456 → 拆分结果:['a', 'b=456']
  2. 输入a='123,456',b → 拆分结果:['a='123,456'', 'b']
  3. 输入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=&quot;123,456&quot;,amet=xxx(2,3),&quot;consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;';
$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实体的双引号(&quot;)转换为实际双引号,确保正则能正确识别。

完整代码示例:

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=&quot;123,456&quot;,amet=xxx(2,3),&quot;consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.&quot;';
$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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 06:15:28