Решение самой задачи:
function checkBrackets($sData) {
$sRegexp = '#^((?:\((?1)\)|\[(?1)\]|\{(?1)\}|[^()\[\]\{\}]++)*+)$#';
return preg_match($sRegexp, $sData);
}
assert('checkBrackets("(()()([][])[])")==true');
assert('checkBrackets("abc([dy]*[dx]Fz)")==true');
assert('checkBrackets("")==true');
assert('checkBrackets("()[]")==true');
assert('checkBrackets("foo()")==true');
assert('checkBrackets("foo(")==false');
assert('checkBrackets("pqr[Gdz)/(Hdx]")==false');
//test pass
Не пробуйте такой ответ давать на собеседовании, если не сможете повторить.
На самом деле регулярка страшно выглядит только из-за отсутствия форматирования (специально не форматировал для особого впечатления).
Если интересны регулярки - весьма рекомендую книжку:
www.ozon.ru/context/detail/id/4066500
Убрать всё, кроме -
preg_replace('~[^\[\]\(\)\{\}]~', '', $sInput)
Но в классическом решении через стек и это не нужно - в стек заносите только скобки, остальные символы игнорируете.