Я написал регулярное выражение в 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 }