Что я тут не так сделал? [Javascript Regex]

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

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

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

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

20.08.2008 21:11:34
8 ОТВЕТОВ
РЕШЕНИЕ

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

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

Ищет

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

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

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

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

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

14
15.12.2014 13:39:05
\ w - это сокращение от буквы, цифр и подчеркивания. Я бы упростил это до / ^ \ w + $ /
Juan Mendes 22.03.2010 18:53:09
@Juan, в большинстве языков, что считается словом, зависит от системы и локали, разве это не так в JS?
tobyodavies 10.12.2010 01:27:15
Большинство ссылок на RegEx перечисляют \ w просто как ярлык к [a-zA-Z_0-9]. Java: download.oracle.com/javase/6/docs/api/java/util/regex/Pattern . PHP использует POSIX, который в основном говорит то же самое. Относится и к JS. /\w/.test("é")возвращает false, когда моя локаль установлена ​​в pt-br. Я никогда не слышал о том, чтобы быть действительно умным в обнаружении других локалей.
Juan Mendes 10.12.2010 18:41:42

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

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

6
8.02.2016 13:24:27

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

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

0
8.02.2016 13:25:44

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

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

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

0
20.08.2008 21:26:32

Я проверил ваш сценарий и вмешался в 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
15.12.2014 13:39:46

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

0
8.02.2016 13:24:53

Более простой способ написать это было бы

var name_regex = /^([a-z0-9_])+$/i;
0
20.08.2008 22:48:12

Еще проще:

var name_regex = /^\w+$/;
0
21.08.2008 04:31:29