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

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

<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 个或多个字母、数字或下划线(勾选)

然后无论发生什么都没关系。该正则表达式将匹配任何以字母、数字或下划线开头的内容

如果你放一个 $ 最后,它就会起作用 - $ 匹配“字符串结尾”,因此唯一可以匹配的方法是如果存在 仅有的 字符串开头和结尾之间的数字、字母和下划线。

/^([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