问题描述
|
我需要一个正则表达式,匹配一个不在\'[\'和\'] \'或\'(\'和\')\'或\'{\'和\'} \之间的逗号'。其他分组符号无关紧要。我试图弄清楚,但是我无法提出任何可以实现这一目标的东西。
正则表达式将与PHP preg_split函数一起使用,以在匹配的逗号上分割字符串。
包含逗号和分组符号的示例字符串:
<div>Hello<div>,@func[opt1,opt2],{,test},blahblah
该字符串应按如下所示拆分:
1: \'<div>Hello<div>\'
2: \'@func[opt1,opt2]\'
3: \'{,test}\'
4: \'blahblah\'
我只是想到了这一点,但是在这一点上,所有分组符号都必须保证具有匹配的符号,以防万一。
任何帮助将得到极大的应用=)
解决方法
实际上,完成拆分并非并非不可能。考虑以下代码:
$str = \'<div>Hello<div>,(foo,bar),@func[opt1,opt2],{,test},blahblah\';
$arr = preg_split(\'~([^,]*(?:{[^}]*}|\\([^)]*\\)|\\[[^]]*])[^,]*)+|,~\',$str,-1,PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
var_dump($arr);
输出:
array(5) {
[0]=>
string(15) \"<div>Hello<div>\"
[1]=>
string(9) \"(foo,bar)\"
[2]=>
string(16) \"@func[opt1,opt2]\"
[3]=>
string(7) \"{,test}\"
[4]=>
string(8) \"blahblah\"
}
,我不认为可以用正则表达式来完成。基本的问题是,这需要可变长度的负向后看(不允许任何[[{{没有后面跟有])}),并且这不是RE当前具有的功能。