if( preg_match_all('/\[[a-z]{1,}\]/', '[controller]/[action](/[id])', $matches) )
{
var_dump($matches); // как и было, так и осталось
}
Должно выводить:
1) [controller]/[action]/[id] -> ['controller', 'action', 'id']
2) [controller]/[action](/[id]) -> ['controller', 'action']