我有一个字符串如下(示例中的字母可以是数字或文本,可以是大写或小写或两者。如果一个值是一个句子,它应该在单引号之间):
$string="a,b,c,(d,e,f),g,'h, i j.',k";
我怎样才能分解它以获得以下结果?
Array([0]=>"a",[1]=>"b",[2]=>"c",[3]=>"(d,e,f)",[4]=>"g",[5]=>"'h,i j'",[6]=>"k")
我认为使用正则表达式将是一种既快速又干净的解决方案。有什么想法吗?
编辑: 这是我到目前为止所做的,这对于括号之间有很长部分的字符串来说非常慢:
$separator="*"; // whatever which is not used in the string
$Pattern="'[^,]([^']+),([^']+)[^,]'";
while(ereg($Pattern,$String,$Regs)){
$String=ereg_replace($Pattern,"'\\1$separator\\2'",$String);
}
$Pattern="\(([^(^']+),([^)^']+)\)";
while(ereg($Pattern,$String,$Regs)){
$String=ereg_replace($Pattern,"(\\1$separator\\2)",$String);
}
return $String;
这将替换括号之间的所有逗号。然后我可以用逗号分解它并将 $separator
替换为原来的逗号。
最佳答案
您可以使用 preg_match_all 完成这项工作
$string="a,b,c,(d,e,f),g,'h, i j.',k";
preg_match_all("~'[^']+'|\([^)]+\)|[^,]+~", $string, $result);
print_r($result[0]);
解释:
诀窍是在 ,
之前匹配括号
~ Pattern delimiter
'
[^'] All charaters but not a single quote
+ one or more times
'
| or
\([^)]+\) the same with parenthesis
| or
[^,]+ Any characters except commas one or more times
~
请注意 [^']+'
中的量词, 在 [^)]+\)
而且在[^,]+
都自动优化为possessive quantifiers由于“自动拥有”,在编译时。前两个是因为字符类不包含下一个字符,最后一个是因为它位于模式的末尾。在这两种情况下,最终的回溯都是不必要的。
如果您有多个分隔符,例如引号(打开和关闭都相同),您可以使用捕获组这样编写您的模式:
$string="a,b,c,(d,e,f),g,'h, i j.',k,°l,m°,#o,p#,@q,r@,s";
preg_match_all('~([\'#@°]).*?\1|\([^)]+\)|[^,]+~', $string, $result);
print_r($result[0]);
解释:
(['#@°]) one character in the class is captured in group 1
.*? any character zero or more time in lazy mode
\1 group 1 content
带嵌套括号:
$string="a,b,(c,(d,(e),f),t),g,'h, i j.',k,°l,m°,#o,p#,@q,r@,s";
preg_match_all('~([\'#@°]).*?\1|(\((?:[^()]+|(?-1))*+\))|[^,]+~', $string, $result);
print_r($result[0]);
关于php - 使用正则表达式分解字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16476744/