あなたが正規表現でこれをやろうとしてひどい混乱に取得するつもりです。文字列の文字をループしてこの種のチェックを行うのはとても簡単です。
<?php
function specialsplit($string) {
$level = 0; // number of nested sets of brackets
$ret = array(''); // array to return
$cur = 0; // current index in the array to return, for convenience
for ($i = 0; $i < strlen($string); $i++) {
switch ($string[$i]) {
case '(':
$level++;
$ret[$cur] .= '(';
break;
case ')':
$level--;
$ret[$cur] .= ')';
break;
case ',':
if ($level == 0) {
$cur++;
$ret[$cur] = '';
break;
}
// else fallthrough
default:
$ret[$cur] .= $string[$i];
}
}
return $ret;
}
var_export(specialsplit("string1 (sString1, sString2,(ssString1, ssString2)), string2, string3"));
/*array (
0 => 'string1 (sString1, sString2,(ssString1, ssString2))',
1 => ' string2',
2 => ' string3',
)*/
分割する1文字以上の文字列がある場合は、この手法ははるかに難しいことに注意してください。
この式は、正規ではないので、これは、正規表現のための仕事ではありません。 [this epic](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454)と同じです。 :) – deceze