我在这里做错了什么?[Javascript 正则表达式]
-
09-06-2019 - |
题
所以我正在编写一个注册表,我需要显示名称只能是数字、字母和下划线。
看看我的代码并告诉我我做错了什么。
<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 个或多个字母、数字或下划线(勾选)
然后无论发生什么都没关系。该正则表达式将匹配任何以字母、数字或下划线开头的内容
如果你放一个 $
最后,它就会起作用 - $
匹配“字符串结尾”,因此唯一可以匹配的方法是如果存在 仅有的 字符串开头和结尾之间的数字、字母和下划线。
/^([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 所说,这可能是由于缺乏 $
表达式末尾的字符,因为目前它只需要在值的开头有一个有效字符,其余的可以是任何字符。
不隶属于 StackOverflow