Чтобы разрешить только те символы, которые вы описали:
$str = preg_replace("/[^a-zA-Z0-9_+(){}#äöüÄÖÜ -]/", "_", $str);
Чтобы разрешить все пробелы, а не только (пробел) символ:
$str = preg_replace("/[^a-zA-Z0-9_+(){}#äöüÄÖÜ\s-]/", "_", $str);
Чтобы разрешить буквы из разных алфавитов -- не только конкретные, которые вы упомянули, но и такие вещи, как русский и греческий, или другие типы знаков ударения:
$str = preg_replace("/[^\w+(){}#\s-]/", "_", $str);
На вашем месте я бы выбрал последний.Он не только короче и легче для чтения, но и менее ограничен, и нет особого преимущества в блокировке таких вещей, как и
, если äöüÄÖÜ
все в порядке.