Регулярное выражение PHP для соответствия буквенно-числовым строкам с некоторыми (но не все) пунктуациями

Я написал регулярное выражение в PHP, чтобы строки, которые являются альфа-цифрами с любой пунктуацией, кроме & или @ . По сути, мне нужно разрешить что-либо на стандартной американской клавиатуре, за исключением этих двух символов. Мне потребовалось некоторое время, чтобы придумать следующее регулярное выражение, которое, кажется, делает то, что мне нужно:

if (ereg("[^]A-Za-z0-9\[!\"#$%'()*+,./:;<=>?^_`{|}~\-]", $test_string)) { // error message goes here } 

Это подводит меня к моему вопросу … есть ли лучший, более простой или более эффективный способ?

Посмотрите на диапазоны символов:

@[!-%'-?A-~]+@

Это исключает символы & (\0x26) и @ (0x40) . Посмотрев таблицу ASCII , вы можете увидеть, как это работает: восклицательный знак – это первый символ в наборе ASCII, который не является пробелом. Затем он будет соответствовать всем до и включая символ % , который сразу предшествует амперсанду. Затем следующий диапазон до символа @ , который находится между ? и A После этого мы сопоставляем все до конца стандартного набора символов ASCII, который равен ~ .

Обновить

Чтобы сделать чтение более понятным, вы также можете сделать это в два этапа: сначала выберите что-либо вне диапазона ASCII по умолчанию.

@[!-~]+@

На втором этапе отфильтруйте нежелательные символы или просто сделайте str_pos для символов.

В конце вы можете сравнить его с тем, что вы начали видеть, содержит ли он какие-либо нежелательные символы.

Вместо этого вы также можете использовать регулярное выражение, такое как это для второго шага. /[^@&]+/

Этапы взаимозаменяемы и делают str_pos на @ или & в качестве первого шага, чтобы идентифицировать плохие символы, могут быть более эффективными.

Как насчет этого:

 [^&@] 

с preg_match

 $str = 'a'; var_dump(preg_match('~^[^&@]+$~', $str)); // true $str = '&'; var_dump(preg_match('~^[^&@]+$~', $str)); // false $str = '!'; var_dump(preg_match('~^[^&@]+$~', $str)); // true 

Я думаю, а не тестирование для всех буквенных символов, которые вы можете просто проверить на @ и & и использовать нет?

 $reg = '/@|&/'; if(!preg_match($reg, "YOUR STRING CAN GO HERE")){ // your code goes here }