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,对不起,我输入了格式的一个重要细节。括号内的报价可以在括号内,但不必在开盘和收盘后立即开始。更新答案以了解更多详细信息。