Что вы можете сделать, это использовать рекурсивный шаблон для рекурсии первого подшаблона, используя (?1)
, чтобы соответствовать всем круглым скобкам, чтобы разделение также не разделялось внутри скобок, и использовать SKIP FAIL .
Затем разделите запятую, за которой следуют 0+ горизонтальных пробельных символов
(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*
Regex demo | Php демо
$re = '/(\((?:[^()]++|(?1))*\))(*SKIP)(*F)|,\h*/';
$strings = [
"Test A, Test B, Test C (data1, data1)",
"Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E (data1, data1(data, data))",
"Test A, Test B, Test C (data1, data1), Test D (data1, data1), Test E ((data1, data1))"
];
foreach($strings as $s) {
print_r(preg_split($re, $s));
}
Выход
Array
(
[0] => Test A
[1] => Test B
[2] => Test C (data1, data1)
)
Array
(
[0] => Test A
[1] => Test B
[2] => Test C (data1, data1)
[3] => Test D (data1, data1)
[4] => Test E (data1, data1(data, data))
)
Array
(
[0] => Test A
[1] => Test B
[2] => Test C (data1, data1)
[3] => Test D (data1, data1)
[4] => Test E ((data1, data1))
)