Регулярное выражение PHP для сопоставления буквенно-цифровых строк с некоторыми (но не со всеми) знаками препинания
-
11-10-2019 - |
Вопрос
Я написал регулярное выражение на 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
}