Как написано, это регулярное выражение будет соответствовать нулю или более из перечисленных символов в начале строки - это означает, что он всегда будет успешным, независимо от того, что находится во входной строке. Если вы хотите ограничить ввод только этими символами, вам нужно закрепить его на обоих концах:
'/^[0-9a-zA-Z_@ !-]*$/'
Но помните, что он все равно будет соответствовать пустой строке; если вы хотите предотвратить это, вы должны изменить *
на +
.
Обратите внимание, как я удалил два дефиса и добавил один в конец класса символов. Поскольку дефисы имеют особое значение в классах символов, вы должны сделать их как можно более понятными, если хотите буквально их сопоставить. Вы делаете это либо путем экранирования с обратной косой чертой, либо путем помещения его в первую или последнюю позицию.
«Дополнительные» дефисы в вашем регулярном выражении фактически рассматривались как буквальные дефисы, потому что они не могли образовывать диапазоны там, где были - в каждом случае предыдущий символ уже был частью диапазона. Однако не стоит полагаться на такое поведение; не все регулярные выражения столь же прощающие, как PHP. И, конечно, выглядит как ошибка для любого, кто читает ваш код.