Попробуйте что-то вроде этого:
$text = "stop [chomping [too] early] here!";
$text =~ s/\[([^\[\]]|(?0))*]//g;
print($text);
, который напечатает:
stop here!
Краткое объяснение:
\[ # match '['
( # start group 1
[^\[\]] # match any char except '[' and ']'
| # OR
(?0) # recursively match group 0 (the entire pattern!)
)* # end group 1 and repeat it zero or more times
] # match ']'
Выражение, приведенное выше, будет заменено напустая строка.
Вы можете проверить это онлайн: http://ideone.com/tps8t
РЕДАКТИРОВАТЬ
Как уже упоминалось @ridgerunner, вы можете сделать регулярное выражение более эффективным, сделав *
и класс персонажа [^\[\]]
совпадает один или несколько раз и , что делает его притяжательным , и даже путем создания группы без захвата из группы 1:
\[(?:[^\[\]]++|(?0))*+]
Но реальное улучшение скорости может быть заметно только при работе с большими струнами (вы можете проверить это, конечно!).