Регулярное выражение - требуется небольшое изменение - PullRequest
2 голосов
/ 31 июля 2010

Мне нужно регулярное выражение, которое будет разрешать только от a до z и от 0 до 9. Я встречал функцию ниже на этом сайте, но она допускает несколько символов через (# .-). Как это сделать, если он должен разрешать только от a до z (как в верхнем, так и в нижнем регистре) и от 0 до 9? Я боюсь его редактировать, поскольку ничего не знаю о регулярных выражениях.

Это регулярное выражение также полезно для проверки от a до z и от 0 до 9, или есть способ улучшить его.

function isValid($str) {
    return !preg_match('/[^A-Za-z0-9.#\\-$]/', $str);
}

Спасибо

Ответы [ 3 ]

3 голосов
/ 31 июля 2010

В данном случае вам нужно следующее:

function isValid($str) {
    return !preg_match('/[^A-Za-z0-9]/', $str);
}

Конструкция регулярного выражения […] называется классом символов . Что-то вроде [aeiou] соответствует одному из любых гласных.

[^…] является классом символов с отрицанием , поэтому [^aeiou] соответствует одному из чего угодно, кроме гласных (которые включают согласные, цифры, символы и т. Д.).

-, в зависимости от того, где и как оно появляется в определении класса символов, является определением диапазона , поэтому 0-9 совпадает с 0123456789.

Таким образом, регулярное выражение [^A-Za-z0-9] фактически соответствует символу, который не является ни буквой, ни цифрой. Вот почему результат preg_match сводится к нулю с !.

То есть логика вышеуказанного метода использует двойное отрицание :

isValid = it's not the case that
              there's something other than a letter or a digit
                  anywhere in the string

Вы также можете избавиться от двойного отрицания и использовать что-то вроде этого:

function isValid($str) {
    return preg_match('/^[A-Za-z0-9]*$/', $str);
}

Теперь нет отрицания. ^ и $ являются началом и якорями строки, а * является метасимволом повторения ноль или один. Теперь логика проста:

isValid = the entire string from beginning to end
              is a sequence of letters and digits

Ссылки

Смежные вопросы


Альтернатива без регулярных выражений

В некоторых языках есть стандартные функции / идиоматические способы проверки того, что строка состоит только из буквенно-цифровых символов (среди других возможных строковых «типов»).

Например, в PHP вы можете использовать ctype_alnum.

bool ctype_alnum ( string $text )

Проверяет, являются ли все символы в предоставленной строке, text, буквенно-цифровыми.

API ссылки

  • Функции PHP Ctype - список всего семейства функций ctype
    • ctype_alpha, digit, lower, upper, space и т. Д.
2 голосов
/ 31 июля 2010

Хотя я ничего не имею против регулярных выражений, с таким простым шаблоном вам, вероятно, стоит подумать об использовании

if(ctype_alnum($input)) {

http://uk3.php.net/manual/en/function.ctype-alnum.php

0 голосов
/ 31 июля 2010

Вы можете сопоставить z и 0-9 с [Zz0-9], и вы можете сопоставить z и 0-9 с [a-z0-9].Если вы хотите использовать как верхний, так и нижний регистр, вы должны использовать [A-Za-z0-9].

Подробнее об этом см. классы символов регулярных выражений .

Далее !preg_match()не действительно нужно.Вместо этого вы можете использовать положительное совпадение с тем, что вы хотите, например, return preg_match('/^[A-Za-z0-9]+$/', $str); Тот, который у вас есть, на самом деле является классом отрицанных символов, поэтому он будет запрещать все, что находится в скобках.Возможно, я неправильно понимаю вашу цель.

...