【问题标题】:Why is this javascript url validator failing?为什么这个 javascript url 验证器失败了?
【发布时间】:2015-08-27 04:41:57
【问题描述】:

我有以下代码来验证一个人是否在文本框中输入了“有效”网址:

 function validateURL(textval) {
var urlregex = new RegExp(
    "^(http:\/\/www.|https:\/\/www.|ftp:\/\/www.|www.){1}([0-9A-Za-z]+\.)");
return urlregex.test(textval);

}

用户收到错误,返回 false 似乎是有效的 urL

http://a.website.com/issues/i#browse/TEST-111

有人可以确认为什么这个例子不能通过“有效网址”测试吗?

【问题讨论】:

  • 你为什么要求一个 URL 中包含www
  • @DenysSéguret — 是的,你可以。它启动片段标识符。
  • 您到底想在 URL 中匹配/验证什么?仅起始部分,直到/issues?
  • 根据mathiasbynens.be/demo/url-regex 最好是来自@diegoperini 来识别大多数用例
  • 您是否注意到您没有在没有 www 的情况下针对 http 进行验证?

标签: javascript regex parsing url


【解决方案1】:

有人可以确认为什么这个例子不能通过“有效网址”测试吗?

正则表达式的主要问题是www. 部分在模式中是必填的

如果您想使其成为可选,请使用 ? 修饰符和围绕它的一组 ((?:www\.)?):

^(?:(?:(?:ftp|https?):\/\/)?)(?:www\.)?[0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*

这将匹配http://a.website.com 部分。要匹配整个字符串,您可以使用:

^(?:(?:(?:ftp|https?):\/\/)?)(www\.)?[0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*(?:\/[^\/]*)*$

demo

var re = /^(?:(?:(?:ftp|https?):\/\/)?)(www\.)?[0-9A-Za-z]+(?:\.[0-9A-Za-z]+)*(?:\/[^\/]*)*$/; 
var str = 'http://a.website.com/issues/i#browse/TEST-111';
 
if ((m = re.exec(str)) !== null) {
    document.getElementById("res").innerHTML = m[0];
}
<div id="res"/>

【讨论】:

    【解决方案2】:

    您的正则表达式要求主机名部分以 www. 开头(这不是一般 URL 的要求)。您正在测试的 URL 不包括 www.


    正则表达式被破坏的原因还有很多(您没有测试超过www. 之后的第一个字符,您尝试这样做会禁止 URL 中允许的许多字符等),但这就是 URL 的原因你没有通过。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-08
      • 1970-01-01
      • 2018-09-12
      • 2012-12-04
      • 2021-02-09
      • 1970-01-01
      相关资源
      最近更新 更多