Что я тут не так сделал? [Javascript Regex] - PullRequest
3 голосов
/ 21 августа 2008

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

Посмотрите на мой код и скажите, что я делаю неправильно.

<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>

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

Ответы [ 8 ]

14 голосов
/ 21 августа 2008

Ваше регулярное выражение

/^([a-zA-Z0-9_])+/

Ищет

  1. Начало строки (проверка), затем
  2. 1 или более букв, цифр или подчеркивания (отметка)

А потом, что бы ни последовало после, это не имеет значения. Это регулярное выражение будет совпадать с чем угодно, если оно начинается с буквы, цифры или подчеркивания

Если вы поставите $ в конце, то он будет работать - $ соответствует 'концу строки', поэтому он может соответствовать только при наличии только цифр, букв и подчеркивает между началом и концом строки.

/^([a-zA-Z0-9_])+$/

Во-вторых, я бы предложил использовать document.getElementById('display-name').value вместо document.forms, так как он не сломается, если вы переставите HTML, и является более «общепринятым стандартом того, что делать»

6 голосов
/ 21 августа 2008

Мои регулярные выражения будут выглядеть следующим образом: /^[a-zA-Z0-9_]+$/

edit: я думаю, что отсутствие конца строки $ делает его неудачным.

0 голосов
/ 21 августа 2008

Еще проще:

var name_regex = /^\w+$/;
0 голосов
/ 21 августа 2008

Более простой способ написать это все равно будет

var name_regex = /^([a-z0-9_])+$/i;
0 голосов
/ 21 августа 2008

Извините, ребята, я должен был быть более конкретным. Всякий раз, когда я добавил пробелы, значения все еще принимались. Знак доллара $ сделал свое дело!

0 голосов
/ 21 августа 2008

Я проверил ваш сценарий и вмешался в 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>
0 голосов
/ 21 августа 2008

Что значит "не работает"? Отклоняет ли оно допустимые отображаемые имена? Принимает ли недопустимые отображаемые имена? Какие из них?

За @Annan, если не указывать $, регулярное выражение будет принимать недопустимые отображаемые имена, такие как abc123!@#.

Если код отклоняет допустимые отображаемые имена, это может быть связано с тем, что круглые скобки сопоставляются буквально, а не обозначают группу (я не уверен в соглашении о цитировании в JS).

0 голосов
/ 21 августа 2008

Под «не работает», я так понимаю, вы имеете в виду, что пропускает недействительные записи (а не пропускает действительные записи).

Как сказал @Annan, это может быть связано с отсутствием символа $ в конце выражения, поскольку в настоящее время требуется только один действительный символ в начале значения, а остальные могут будь что угодно.

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