JS 正则表达式 url 验证

新手上路,请多包涵

我尝试使用或不使用 http 来验证 url 无论我做了什么,该函数都返回 false。我在这个网站上检查了我的正则表达式字符串: http ://regexr.com/ 和我预期的一样。

     function isUrlValid(userInput) {
        var regexQuery = "/(http(s)?://.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/";
        var url = new RegExp(regexQuery,"g");
        if (url.test(userInput)) {
            alert('Great, you entered an E-Mail-address');
            return true;
        }
        return false;
    }

我通过将 .test 更改为 .match 并按原样保留正则表达式来解决问题。

原文由 motis10 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 436
2 个回答

我将函数更改为 Match + 在此处使用斜杠及其工作进行更改:(http(s)?://.)

固定功能:

 function isUrlValid(userInput) {
    var res = userInput.match(/(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)/g);
    if(res == null)
        return false;
    else
        return true;
}

原文由 motis10 发布,翻译遵循 CC BY-SA 3.0 许可协议

我相信另一个答案会拒绝一些有效的 url(比如大写的域名或长子域)并允许一些无效的 url(比如 http://www.-example-.com 或 www.%@&.com)。我试图考虑一些额外的 url 语法规则(没有进入国际化)。

 function isUrlValid(userInput) {
    var regexQuery = "^(https?://)?(www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z0-9]{0,61}[a-z0-9]\\.[a-z]{2,6}(/[-\\w@\\+\\.~#\\?&/=%]*)?$";
    var url = new RegExp(regexQuery,"i");
    return url.test(userInput);
}
var input = ["https://o.sub-domain.example.com/foo/bar?foo=bar&boo=far#a%20b",
             "HTTP://EX-AMPLE.COM",
             "example.c",
             "example-.com"];
for (var i in input) document.write(isUrlValid(input[i]) + ": " + input[i] + "<br>");

为了同时允许 IP 地址和端口号,正则表达式为:

 "^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a-z]{2,6})|((\\d{1‌​,3}\\.){3}\\d{1,3}))‌​(:\\d{2,4})?(/[-\\w@‌​\\+\\.~#\\?&/=%]*)?$‌​"

为了也允许域名和问号之间没有斜杠的查询字符串(理论上不允许,但在大多数现实生活中有效),正则表达式是:

 "^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a‌​-z]{2,6})|((\\d‌​{1,3}\\.){3}\\d{1,3}‌​))(:\\d{2,4})?((/|\\‌​?)[-\\w@\\+\\.~#\\?&‌​/=%]*)?$"

还要确保每个 % 后跟一个十六进制数,正则表达式是:

 "^(https?://)?(((www\\.)?([-a-z0-9]{1,63}\\.)*?[a-z0-9][-a-z‌​0-9]{0,61}[a-z0-9]\\‌​.[a-z]{2,6})|((\\d{1‌​,3}\\.){3}\\d{1,3}))‌​(:\\d{2,4})?((/|\\?)‌​(((%[0-9a-f]{2})|[-\‌​\w@\\+\\.~#\\?&/=])*‌​))?$"

_(注意:正如 John Wu 在评论中提到的,存在有效 的单字母域)_ 。

原文由 m69 ‘’snarky and unwelcoming‘’ 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏