我正在尝试验证文本框以确保内部写入 URL(减去“http://”部分)。这是我的代码:
var isUrl;
var regex = new RegExp("^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)");
var siteUrl = e.target.value;
if (siteUrl.match(regex)) {
isUrl = true;
}
else {
isUrl = false;
}
所以我的正则表达式是 ^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,}) ?)
。
我的印象是这会执行以下操作:
- 不匹配以
http
开头的任何内容。它正确执行 - 在开头允许可选的
www.
- 接受输入 a-z 中的 1 个或多个字符
- 接受这些字符后面的点
- 接受点后面的 2 个或更多字符,并且
- 允许有一个可选的点,后跟两个或多个字符。
实际上,文本框接受诸如“ashdiguasdf”和“aksjdnfa:://',~”之类的字符串,但它不应该这样做。谁能解释一下为什么吗?
最佳答案
主要问题是您在带引号的字符串中使用 \
字符,javascript 会将其解释为“控制字符”的开头(例如 \n
用于换行符等)。
一种选择是通过将 \
替换为 \\
来转义它。
但最简单的解决方案是使用以下格式...
var regex = new RegExp(/^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)/);
这还允许您通过在末尾使用 i
字符使其不区分大小写(如果您愿意),如下所示...
var regex = new RegExp(/^(?!http)(www\.)?(([a-z])+\.[a-z]{2,}(\.[a-z]{2,})?)/i);
<小时/>
作为额外的一点,您使用了更多 capture groups比真正必要的。你的表达式也可以这样写,得到相同的结果......
^(?!http)(?:www\.)?[a-z]+(?:\.[a-z]{2,}){1,2}
关于javascript正则表达式不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31030340/