Что я здесь сделал не так?[Регулярное выражение Javascript]

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

  •  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. Начало строки (проверка), за которым следует
  2. 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, это, вероятно, было бы связано с отсутствием $ символ в конце выражения, поскольку в настоящее время требуется только один допустимый символ в начале значения, а остальное может быть любым.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top