使用正则表达式爆炸字符串

时间:2013-05-10 06:52:47

标签: php regex arrays explode

我有一个字符串如下(示例中的字母可以是数字或文本,可以是大写或小写或两者。如果值是一个句子,它应该在单引号之间):

$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

1 个答案:

答案 0 :(得分:4)

您可以使用preg_match_all

完成工作
$string="a,b,c,(d,e,f),g,'h, i j.',k";

preg_match_all('~\'[^\']++\'|\([^)]++\)|[^,]++~', $string,$result);
print_r($result[0]);

说明:

诀窍是在<{1}} 之前匹配括号

,

如果您有多个分隔符(如引号(打开和关闭时相同)),您可以使用捕获组编写这样的模式:

~          Pattern delimiter
'
[^']       All charaters but not a single quote
++         one or more time in [possessive][1] mode
'
|          or
\([^)]++\) the same with parenthesis
|          or
[^,]       All characters but not a comma
++
~

说明:

$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