Правила проверки регулярных выражений - PullRequest
2 голосов
/ 01 февраля 2012

Я пишу функцию резервного копирования базы данных как часть моего школьного проекта.

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

Под «легальным» я подразумеваю строку, которая не содержит ЛЮБЫХ символов или пробелов. Только буквы алфавита и цифры.

Примером допустимой строки будет '31Jan2012' или '63927jkdfjsdbjk623' или 'hello123backup'.

Вот мой код JS:

    // Check if the input box contains the charactes a-z, A-Z ,or 0-9 with a regular expression.

    function checkIfContainsNumbersOrCharacters(elem, errorMessage){
        var regexRule = new RegExp("^[\w]+$");
        if(regexRule.test( $(elem).val() ) ){ 
            return true;
        }else{
            alert(errorMessage);
            return false;
        }
    }


//call the function

checkIfContainsNumbersOrCharacters("#backup-name", "Input can only contain the characters a-z or 0-9.");

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

^[\w]+$

^ = начало строки

[/ w] = a-z / A-Z / 0-9

'+' = символы после строки.

При запуске моей функции, любая введенная строка возвращает false :( мой код неверен? Или я не правильно использую правила регулярных выражений?

Ответы [ 5 ]

2 голосов
/ 01 февраля 2012

Проблема здесь в том, что при записи \w внутри строки вы экранируете w, и результирующее регулярное выражение выглядит следующим образом: ^[w]+$, содержащее w в качестве литерального символа.При создании регулярного выражения со строковым аргументом, передаваемым конструктору RegExp, вам необходимо экранировать обратную косую черту, например: new RegExp("^[\\w]+$"), которая создаст необходимое регулярное выражение.

Существует способизбегайте этого, используя сокращенную запись, предоставляемую JavaScript: var regex = /^[\w]+$/;, которая не требует дополнительного экранирования.

2 голосов
/ 01 февраля 2012

Это может быть проще.Это работает:

function checkValid(name) {
  return /^\w+$/.test(name);
}

/^\w+$/ - буквальная запись для new RegExp().Поскольку функция .test возвращает логическое значение, вам нужно только вернуть ее результат.Это также выглядит лучше, чем new RegExp("^\\w+$"), и вы с меньшей вероятностью ошибетесь (спасибо @ x3ro за указание на необходимость двух обратных слешей в строках).

2 голосов
/ 01 февраля 2012

Когда вы объявляете регулярное выражение в качестве строкового параметра для конструктора RegExp, вам нужно его экранировать.Оба

var regexRule = new RegExp("^[\\w]+$");

... и ...

var regexRule = new RegExp(/^[\w]+$/);

будут работать.

Имейте в виду, что проверка на стороне клиента для данных базы данных никогда не будетдостаточно, так как проверку легко обойти, отключив JavaScript в браузере, и недействительные / вредоносные данные могут попасть в вашу БД.Вам необходимо проверить данные на стороне сервера, но рекомендуется запретить запрос с неверными данными, но проверка на стороне клиента является хорошей практикой.

2 голосов
/ 01 февраля 2012

\w является синонимом [[: alnum:]], который соответствует одному символу класса alnum. Обратите внимание, что использование классов символов означает, что вы можете сопоставлять символы, которые не являются частью кодировки символов ASCII, что может или не может быть тем, что вы хотите. Если то, что вы действительно хотите сопоставить, это [0-9A-Za-z], то это то, что вы должны использовать.

1 голос
/ 01 февраля 2012

Это официальная спецификация: http://dev.mysql.com/doc/refman/5.0/en/identifiers.html, но она не очень легко конвертируется в регулярное выражение.Просто регулярное выражение не сделает этого, так как есть также зарезервированные слова .

Почему бы просто не поместить его в запрос (не забудьте правильно его избежать) и позволить MySQL датьу вас ошибка?Например, может быть ошибка в используемой вами версии MySQL, и даже если ваша проверка верна, MySQL все равно может отказаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...