Что я здесь сделал не так?[Регулярное выражение Javascript]
-
09-06-2019 - |
Вопрос
Итак, я пишу регистрационную форму, и мне нужно, чтобы отображаемое имя состояло только из цифр, букв и подчеркиваний.
Взгляните на мой код и скажите мне, что я делаю не так.
<form method="post" action="/" onsubmit="return check_form()">
<input type="text" id="display-name" name="display-name" maxlength="255" />
<input type="submit" />
</form>
<script type="text/javascript">
<!--
var name_regex = /^([a-zA-Z0-9_])+/
function check_form()
{
if (!name_regex.test(document.forms[0].elements[0].value))
{
document.forms[0].elements[0].focus()
alert("Your display name may only contain letters, numbers and underscores")
return false
}
}
-->
</script>
Очевидно, что он был урезан, чтобы не включать ничего, не связанного с проблемой, но даже этот фрагмент не работает.
Решение
Ваше регулярное выражение
/^([a-zA-Z0-9_])+/
Ищет
- Начало строки (проверка), за которым следует
- 1 или более букв, цифр или подчеркивания (проверить)
А потом, что бы ни было после, это не имеет значения.Это регулярное выражение будет соответствовать чему угодно вообще, если оно начинается с буквы, цифры или подчеркивания
Если вы поставите $
в конце концов, тогда это сработает - $
совпадает с 'end of string', поэтому он может совпадать только в том случае, если есть Только цифры, буквы и подчеркивания между началом и концом строки.
/^([a-zA-Z0-9_])+$/
Во-вторых, я бы предложил использовать document.getElementById('display-name').value
вместо того, чтобы document.forms
поскольку он не сломается, если вы измените порядок HTML, и является скорее "общепринятым стандартом того, что делать"
Другие советы
Мое регулярное выражение будет выглядеть следующим образом: /^[a-zA-Z0-9_]+$/
Редактировать:Я думаю, это из-за отсутствия конца строки $
это приводит к его провалу.
Что значит "не работает"?Отклоняет ли он допустимые отображаемые имена?Принимает ли он недопустимые отображаемые имена?Какие именно?
Согласно @Annan, оставляя в стороне $
заставило бы регулярное выражение принимать недопустимые отображаемые имена, такие как abc123!@#
.
Если код отклоняет допустимые отображаемые имена, это может быть связано с тем, что круглые скобки сопоставляются буквально вместо обозначения группы (я не уверен в соглашении о цитировании в JS).
Более простым способом написать это по-прежнему было бы
var name_regex = /^([a-z0-9_])+$/i;
Еще проще:
var name_regex = /^\w+$/;
Я протестировал ваш скрипт и вмешался в javascript.Кажется, это работает:
<form method="post" action="/" onsubmit="return check_form()">
<input type="text" id="display-name" name="display-name" maxlength="255" />
<input type="submit" />
</form>
<script type="text/javascript">
<!--
var name_regex = /^([a-zA-Z0-9_])+$/;
function check_form()
{
if (!name_regex.test(document.forms[0].elements[0].value))
{
document.forms[0].elements[0].focus();
alert("Your display name may only contain letters, numbers and underscores");
return false;
}
}
-->
</script>
Извините, ребята, мне следовало быть более конкретным.Всякий раз, когда я добавлял пробелы, значения по-прежнему принимались.Знак доллара $
сделал свое дело!
Под "не работает", я так понимаю, вы подразумеваете, что он пропускает недопустимые записи (а не не пропускает допустимые записи).
Как сказал @Annan, это, вероятно, было бы связано с отсутствием $
символ в конце выражения, поскольку в настоящее время требуется только один допустимый символ в начале значения, а остальное может быть любым.