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

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

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

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

Ответы [ 3 ]

3 голосов
/ 17 декабря 2010

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

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

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

Обновление

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

@[!-~]+@

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

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

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

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

1 голос
/ 17 декабря 2010

Что по этому поводу:

[^&@]

с preg_match

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

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

$str = '!';
var_dump(preg_match('~^[^&@]+$~', $str)); // true
0 голосов
/ 17 декабря 2010

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

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