Я полагаю, что вы делаете отдельные проверки для слишком длинных или слишком коротких строк, и это регулярное выражение только проверяет, нет ли недопустимых символов. Это должно сделать это:
~^[a-z0-9!@#$%^&*()]+$~i
+
означает один или несколько , *
означает ноль или более ; это, вероятно, не имеет значения, какой вы используете.
Я также избавился от ненужных обратных косых черт; ни один из этих символов не имеет какого-либо особого значения в классе символов (то есть в квадратных скобках).