Php 分隔符不在特定字符内的拆分字符串

Php 分隔符不在特定字符内的拆分字符串,php,regex,Php,Regex,我有一个字符串,格式如下 ,"value","value2","3",("this is, a test"), "3" 当逗号不在括号内时,如何用逗号分隔 编辑:抱歉,有点小问题/更正,括号内的格式实际上是 ,"value","value2","3",(THIS IS THE FORMAT "AND QUOTES, INSIDE"), "3" 你可以检查正则表达式 编辑:使用转义引号,我能快速想到的唯一解决方案就是替换它们,然后再添加它们 preg_match("/,?\"(.*?)\",

我有一个字符串,格式如下

,"value","value2","3",("this is, a test"), "3"
当逗号不在括号内时,如何用逗号分隔

编辑:抱歉,有点小问题/更正,括号内的格式实际上是

 ,"value","value2","3",(THIS IS THE FORMAT "AND QUOTES, INSIDE"), "3"
你可以检查正则表达式

编辑:使用转义引号,我能快速想到的唯一解决方案就是替换它们,然后再添加它们

preg_match("/,?\"(.*?)\",?/", str_replace('\"', "'", $myString), $result);
你可以检查正则表达式

编辑:使用转义引号,我能快速想到的唯一解决方案就是替换它们,然后再添加它们

preg_match("/,?\"(.*?)\",?/", str_replace('\"', "'", $myString), $result);

引号已经足以分隔逗号,因此您也不需要使用括号。如果去掉parens,str_getcsv()就可以了。如果您无法控制源代码,您可以自己剥离它们:

$str = str_replace('",("', '","', $str);
$str = str_replace('"), "', '", "', $str);
print_r(str_getcsv($str))
编辑更新的问题:

只要文件中没有未替换的paren,您仍然可以。只需将close paren转换为open paren(因为getcsv()只能使用单个字符作为分隔符),然后将open paren用作引号字符:

$str = str_replace(')', '(', $str);
print_r(str_getcsv($str, ',', '('));
结果:

Array
(
    [0] =>  
    [1] => "value"
    [2] => "value2"
    [3] => "3"
    [4] => THIS IS THE FORMAT "AND QUOTES, INSIDE"
    [5] =>  "3"
)

引号已经足以分隔逗号,因此您也不需要使用括号。如果去掉parens,str_getcsv()就可以了。如果您无法控制源代码,您可以自己剥离它们:

$str = str_replace('",("', '","', $str);
$str = str_replace('"), "', '", "', $str);
print_r(str_getcsv($str))
编辑更新的问题:

只要文件中没有未替换的paren,您仍然可以。只需将close paren转换为open paren(因为getcsv()只能使用单个字符作为分隔符),然后将open paren用作引号字符:

$str = str_replace(')', '(', $str);
print_r(str_getcsv($str, ',', '('));
结果:

Array
(
    [0] =>  
    [1] => "value"
    [2] => "value2"
    [3] => "3"
    [4] => THIS IS THE FORMAT "AND QUOTES, INSIDE"
    [5] =>  "3"
)

上述解决方案很好,但我还有一个

preg_match_all('@(,)?("|(\())(.+?)((?(3)\)|"))(,)?@',$str,$arr);
这个的输出是

排列 ( [0]=>阵列 ( [0]=>,“值”, [1] =>“值2”, [2] => "3", [3] =>(“这是一个测试”), [4] => "3" )

)


因此$arr[4]包含匹配项

上述解决方案工作正常,但我还有一个

preg_match_all('@(,)?("|(\())(.+?)((?(3)\)|"))(,)?@',$str,$arr);
这个的输出是

排列 ( [0]=>阵列 ( [0]=>,“值”, [1] =>“值2”, [2] => "3", [3] =>(“这是一个测试”), [4] => "3" )

)

因此$arr[4]包含匹配项

请考虑以下代码:

$str = ',"value","value2","3",(THIS IS THE FORMAT \) "AND QUOTES, INSIDE"), "3"';
$regex = '#(\(.*?(?<!\\\)\))\s*,|,#';
$arr = preg_split( $regex, $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
print_r($arr);
考虑以下代码:

$str = ',"value","value2","3",(THIS IS THE FORMAT \) "AND QUOTES, INSIDE"), "3"';
$regex = '#(\(.*?(?<!\\\)\))\s*,|,#';
$arr = preg_split( $regex, $str, 0, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY );
print_r($arr);

下面是一个简单的标记器,可用于将输入拆分为字符串和其他字符:

preg_match_all('/"(?:[^\\\\"]|\\.)*"|[^"]/', $input, $tokens)

如果您想解析输入,只需迭代标记并执行您想要的任何语法检查。您可以通过标记开头和结尾的引号来标识字符串。

这里有一个简单的标记器,您可以使用它将输入拆分为字符串和其他字符:

preg_match_all('/"(?:[^\\\\"]|\\.)*"|[^"]/', $input, $tokens)

如果您想解析输入,只需迭代标记并执行您想要的任何语法检查。您可以通过标记开头和结尾的引号来识别字符串。

我无法回答您的问题,但我知道使用正则表达式将是一个痛苦的世界。匹配所有带引号的字符串就足够了吗?Gumbo不幸的是没有,因为其中可能有转义引号quotes@user391986这没关系,因为可以考虑到。我不能回答你的问题,但我知道使用正则表达式将是一个痛苦的世界。匹配所有带引号的字符串就足够了吗?Gumbo不幸的是没有,因为其中可能有转义引号quotes@user391986这不重要,因为它可以被考虑。不幸的是,这对引号中的转义引号不起作用,OP在对他们的问题的评论中表示,这可能存在。不幸的是,这对引号中的转义引号不起作用,OP在对他们的问题的评论中说可能存在。嗨,亚历克斯,对不起,我给你介绍了格式的一个重要细节。括号内的报价可能在括号内,但不必在开盘和收盘后立即开始。更新了您的额外详细信息的答案。嗨,Alex,对不起,我输入了格式的一个重要细节。括号内的报价可以在括号内,但不必在开盘和收盘后立即开始。更新答案以了解更多详细信息。