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


3

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

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

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

14

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

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

Ищет

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

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

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

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

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

+2

\ ш является обобщающим для букв, цифр и символов подчеркивания. Я бы упростил его до/^ \ w + $/ 22 мар. 102010-03-22 18:53:09

  0

@Juan, в большинстве случаев, что считается символом слова, зависит от системы и языка, не так ли это в JS? 10 дек. 102010-12-10 01:27:15

  0

Большинство списков ссылок RegEx \ w как простой ярлык для [a-zA-Z_0-9]. Java: http://download.oracle.com/javase/6/docs/api/java/util/regex/Pattern. PHP использует POSIX, который в основном говорит то же самое. Также относится к JS. '/\w/.test (" é ")' возвращает false, когда моя локаль установлена ​​на pt-br. Я никогда не слышал о том, что \ w действительно умеет обнаруживать другие локали. 10 дек. 102010-12-10 18:41:42


6

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

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


0

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

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


0

я вижу в фрагменте отсутствует точка с запятой (что и определяет, где заканчивается строка кода).


0

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

Per @Annan, оставляя $, заставит регулярное выражение принимать недопустимые отображаемые имена, такие как [email protected]#.

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


0

Я протестировал ваш скрипт и вмешался в 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

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


0

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

var name_regex = /^([a-z0-9_])+$/i; 

0

Еще проще:

var name_regex = /^\w+$/;