javascript正则表达式不起作用

标签 javascript html regex forms

我正在尝试验证文本框以确保内部写入 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,}) ?)。 我的印象是这会执行以下操作:

  1. 不匹配以 http 开头的任何内容。它正确执行
  2. 在开头允许可选的 www.
  3. 接受输入 a-z 中的 1 个或多个字符
  4. 接受这些字符后面的点
  5. 接受点后面的 2 个或更多字符,并且
  6. 允许有一个可选的点,后跟两个或多个字符。

实际上,文本框接受诸如“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/

相关文章:

regex - 如何在该位置使用Nginx Regex

regex - 采访 : Machine coding/regex (Better alternative to my solution)

javascript - 不使用 anchor 链接转到选项卡?

html - 如何强制 <noscript> 内联并继承 CSS 样式?

regex - perl6 中的变量量词

html - JavaScript:从 JavaScript 加载图像,然后等待该图像的 "load"事件

javascript - 如何根据iframe内容从父窗口触发事件?

javascript - 带有颜色转换 jquery 的进度条?

javascript - 幻灯片在 IE10 中不工作

javascript - 解析 JSON 时出现无效字符