【问题标题】:Javascript: Website url validation with regexJavascript:使用正则表达式验证网站网址
【发布时间】:2017-01-06 06:55:30
【问题描述】:

我正在努力在 javascript 中创建一个正则表达式来验证网站 url。我在 stackoverflow 社区中搜索了一下,没有发现需要完成的内容。

到目前为止我的正则表达式:/(https?:\/\/)?(www\.)?[a-zA-Z0-9]+\.[a-zA-Z]{2,}/g

但它似乎失败并通过了带有两个 w 的 url 的验证,例如 ww.test.com

应该通过正则表达式的测试:

http://www.test.com
https://www.test.com
www.test.com
www.test.co.uk
www.t.com
test.com
test.fr
test.co.uk

不应该通过正则表达式的测试:

w.test.com
ww.test.com
www.test
test
ww.test.
.test
.test.com
.test.co.ul
.test.

有什么建议或想法吗?

【问题讨论】:

  • 那么Mr.Bean也是一个有效的URL?
  • "ww.test.com" 是一个有效的网站地址 - 为什么不是呢? www.test-site.com 也是如此,但您的正则表达式不允许使用连字符。
  • @Panagiotis 为什么不呢?如果以这种方式访问​​某些网站怎么办someurl.user.com 您将 URL 与域名混淆
  • @Panagiotis 使用正则表达式是不可能的。 URL 可能有效但不存在,因此您需要在有效 URL 上解析 URL。
  • @Panagiotis 不确定这是否是一个选项(不明白为什么不),但你可以设置<input type="url"> 如果可能的话,看看这个问题stackoverflow.com/questions/13820477/…

标签: javascript regex url


【解决方案1】:

即使this 的答案对于这个问题来说有点过分,它也说明了这个问题:即使有可能创建一个正则表达式来检查 url,解析 URL 和“创建一个真正的对象”,通过它/可以将整体测试分解为多个较小的测试。

因此,现代浏览器的内置 URL 构造函数可能会在这里为您提供帮助(LINK 1LINK 2)。

测试您的网址的一种方法可能如下所示:

function testURL (urlstring) {
    var errors = [];
    try {
        var url = new URL(urlstring);

        if (!/https/.test(url.protocol)) {
           errors.push('wrong protocol');
        }

        //more tests here

    } catch(err) {
      //something went really wrong
      //log the error here

    } finally {
      return errors;
    }
}


if (testURL('mr.bean').length == 0) { runSomething(); }

【讨论】:

  • 也适用于具有XMLHttpRequest 的不太现代的浏览器。 ;-)
  • 感谢@philipp。由于使用正则表达式测试整个 url 有点不可能,使用这种方式我将根据我的要求测试 url 的特定部分。
【解决方案2】:
/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/g

【讨论】:

  • 解释有用吗?
【解决方案3】:

这是一个非官方的,但对大多数事情都有解释。对于大多数情况,这应该足够了。

(https?:\/\/)?[\w\-~]+(\.[\w\-~]+)+(\/[\w\-~]*)*(#[\w\-]*)?(\?.*)?

  1. (https?:\/\/)? - 是否以http://https:// 开头
  2. [\w\-~]+(\.[\w\-~]+)+ 后跟域名[\w\-~] 和至少一个扩展名(\.[\w\-~])+
    • [\w\-~] == [a-zA-Z0-9_\-~]
    • 多个扩展意味着test.go.place.com
  3. (\/[\w\-~]*)* 然后尽可能多的子目录
    • 为了方便test.com/ 通过,斜线不强制后面的字符。这可以像这样被滥用:test.com/la////la
  4. (#[\w\-]*)? 后面可能是一个元素 id
  5. (\?.*)? 后面可能是 url 参数,(为了简单起见)几乎可以是任何

有很多边缘情况会破坏,或者它应该但它没有。但是,对于大多数情况下人们没有做任何古怪的事情,这应该有效。

【讨论】:

  • 我使用const url_pattern = new RegExp("(https?:\/\/)?[\w\-~]+(\.[\w\-~]+)+(\/[\w\-~]*)*(#[\w\-]*)?(\?.*)?");,它给了我Uncaught SyntaxError: Invalid regular expression。你能告诉我我做错了什么吗?
  • 此正则表达式未格式化为字符串。尝试/[abc123]/ 表示法。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
猜你喜欢
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-15
  • 2012-01-29
  • 2023-03-16
  • 2017-07-25
相关资源
最近更新 更多