5

我需要一个正则表达式来匹配不在“[”和“]”或“(”和“)”或“{”和“}”之间的逗号。其他分组符号无关紧要。我试图弄清楚,但我想不出任何可以做到这一点的东西。

正则表达式将与 PHP preg_split 函数一起使用,以在匹配的逗号上拆分字符串。

包含逗号和分组符号的示例字符串:

<div>Hello<div>,@func[opt1,opt2],{,test},blahblah

字符串应按如下方式拆分:

1: '<div>Hello<div>'
2: '@func[opt1,opt2]'
3: '{,test}'
4: 'blahblah'

我只是想到了这一点,但此时所有分组符号都保证有匹配的符号,以防有帮助。

任何帮助都会非常感谢=)

4

2 回答 2

10

实际上,完成这种拆分并非不可能。考虑这段代码:

$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"
}
于 2011-05-26T02:21:30.717 回答
1

我不认为它可以在正则表达式中完成。基本问题是这需要可变长度的负后视(不允许任何 [({ 后面没有 ])}),这不是 RE 当前具有的功能。

于 2011-05-26T02:06:29.383 回答