4

所以我正在写一个注册表,我需要显示名称只有数字、字母和下划线。

看看我的代码并告诉我我做错了什么。

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

显然它已被精简为不包含与问题无关的任何内容,但即使这个片段也不起作用。

4

8 回答 8

14

你的正则表达式

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

寻找

  1. 字符串开头(检查),后跟
  2. 1 个或多个字母、数字或下划线(检查)

然后无论之后发生什么都没关系。只要它以字母、数字或下划线开头,此正则表达式将完全匹配任何内容

如果你把 a$放在最后,那么它会起作用 -$匹配“字符串结尾”,所以它可以匹配的唯一方法是字符串的开头和结尾之间只有数字、字母和下划线。

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

其次,我建议使用document.getElementById('display-name').value而不是,document.forms因为如果您重新排列 HTML,它不会中断,并且更“普遍接受的做什么标准”

于 2008-08-20T21:22:48.820 回答
6

我的正则表达式将遵循:/^[a-zA-Z0-9_]+$/

编辑:我认为是缺少行尾$导致它失败。

于 2008-08-20T21:18:23.027 回答
0

我认为“不工作”是指它允许无效条目通过(而不是不让有效条目通过)。

正如@Annan 所说,这可能是由于$表达式末尾缺少字符,因为目前它只需要在值的开头有一个有效字符,其余的可以是任何字符。

于 2008-08-20T21:21:31.600 回答
0

“不起作用”是什么意思?它是否拒绝有效的显示名称?它是否接受无效的显示名称?哪个?

根据@Annan,离开$会使正则表达式接受无效的显示名称,例如abc123!@#.

如果代码拒绝有效的显示名称,可能是因为括号是按字面意思匹配的,而不是表示一个组(我不确定 JS 中的引用约定)。

于 2008-08-20T21:26:32.353 回答
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>
于 2008-08-20T21:31:50.467 回答
0

对不起,伙计们,我应该更具体一些。每当我添加空格时,这些值仍然被接受。美元符号$成功了!

于 2008-08-20T22:33:35.000 回答
0

一种更简单的编写方法仍然是

var name_regex = /^([a-z0-9_])+$/i;
于 2008-08-20T22:48:12.407 回答
0

更简单:

var name_regex = /^\w+$/;
于 2008-08-21T04:31:29.367 回答