PCRE / Perl regex, но я просто догадываюсь, что вы хотите (в зависимости от спецификации ниже):
/(?:function\s+|\G(?<!^),\s*)([^,{}]+|\{function\s+(?1)\s*(?:,\s*(?1)\s*)*})\s*/g
Пример Использование Perl:
test('function {function arg1, arg2}, arg3');
test('function foo, {function {function x}, y}, bar');
sub test{
print 'Matched: "', join '", "',
$_[0] =~
/(?:function\s+|\G(?<!^),\s*)
(
[^,{}]+
|
\{function\s+(?1)\s*(?:,\s*(?1)\s*)*}
)
\s*/gx;
print "\"\n";
}
выход
Matched: "{function arg1, arg2}", "arg3"
Matched: "foo", "{function {function x}, y}", "bar"
Должно работать нормально * в PHP , просто экранировать, где необходимо, и использовать с preg_match_all.
Множество вопросов по спецификации tho:
- Содержит ли строка, с которой вы совпадаете, что-то еще, кроме этой?
- Всегда ли есть два аргумента?
- Являются ли аргументы только одним словом?
- Является ли "функция" ключевым словом или именем функции?
Больше (реальных) примеров, пожалуйста!