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

StackOverflow https://stackoverflow.com/questions/4468442

Вопрос

Я написал регулярное выражение на 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
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top