什么是匹配 URL 的好的正则表达式?

IT技术 javascript regex
2021-01-29 01:34:39

目前我有一个输入框,它将检测 URL 并解析数据。

所以现在,我正在使用:

var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)
           (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url= content.match(urlR);

问题是,当我输入类似 的 URL 时www.google.com,它不起作用。当我进入时http://www.google.com,它正在工作。

我对正则表达式不是很流利。谁能帮我?

5个回答

如果您想确保 URL 以 HTTP/HTTPS 开头,则使用正则表达式:

https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

如果您不需要 HTTP 协议:

[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)

要尝试此操作,请参阅http://regexr.com?37i6s,或查看限制较少的版本http://regexr.com/3e6m0

JavaScript 实现示例:

var expression = /[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)?/gi;
var regex = new RegExp(expression);
var t = 'www.google.com';

if (t.match(regex)) {
  alert("Successful match");
} else {
  alert("No match");
}

如果 url 有空格,则不起作用。t = 'www.google.com withspace' t.match(regex) // 返回真
2021-03-10 01:34:39
值得一提的是使用此站点gskinner.com/RegExr 来测试 Regex 并查看常见示例
2021-03-26 01:34:39
这仍然匹配没有有效 TLD 的 URL,即:“ foo/file.html
2021-03-29 01:34:39
regex.test('//.com') => 真
2021-04-01 01:34:39
问题 - 为什么最后一个字符类中有双斜线?在正则表达式 [-a-zA-Z0-9@:%_\+.~#?&//=] 的这一部分中,有一个双斜杠,这对我来说似乎没有必要?您在字符类中放置了两次相同的字符,如果您打算转义正常的斜杠,这将是徒劳的,因为转义是用反斜杠执行的?...
2021-04-03 01:34:39
(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})

将匹配以下情况

  • http://www.foufos.gr
  • https://www.foufos.gr
  • http://foufos.gr
  • http://www.foufos.gr/kino
  • http://werer.gr
  • www.foufos.gr
  • www.mp3.com
  • www.t.co
  • http://t.co
  • http://www.t.co
  • https://www.t.co
  • www.aa.com
  • http://aa.com
  • http://www.aa.com
  • https://www.aa.com

将不匹配以下内容

  • www.foufos
  • www.foufos-.gr
  • www.-foufos.gr
  • foufos.gr
  • http://www.foufos
  • http://foufos
  • www.mp3#.com

var expression = /(https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|www\.[a-zA-Z0-9][a-zA-Z0-9-]+[a-zA-Z0-9]\.[^\s]{2,}|https?:\/\/(?:www\.|(?!www))[a-zA-Z0-9]+\.[^\s]{2,}|www\.[a-zA-Z0-9]+\.[^\s]{2,})/gi;
var regex = new RegExp(expression);

var check = [
  'http://www.foufos.gr',
  'https://www.foufos.gr',
  'http://foufos.gr',
  'http://www.foufos.gr/kino',
  'http://werer.gr',
  'www.foufos.gr',
  'www.mp3.com',
  'www.t.co',
  'http://t.co',
  'http://www.t.co',
  'https://www.t.co',
  'www.aa.com',
  'http://aa.com',
  'http://www.aa.com',
  'https://www.aa.com',
  'www.foufos',
  'www.foufos-.gr',
  'www.-foufos.gr',
  'foufos.gr',
  'http://www.foufos',
  'http://foufos',
  'www.mp3#.com'
];

check.forEach(function(entry) {
  if (entry.match(regex)) {
    $("#output").append( "<div >Success: " + entry + "</div>" );
  } else {
    $("#output").append( "<div>Fail: " + entry + "</div>" );
  }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="output"></div>

在 rubular 中检查它 - 新版本

检查它在rubular - 旧版本

但它会匹配http://www.foufos ,也不会匹配regex.com
2021-03-14 01:34:39
我稍微改变了你的表达方式,所以它可以在我需要的所有情况下工作,包括带有 http:// 的 uri 或www "/([^\s\.]+\.[^\s]{2,}|www\ .[^\s]+\.[^\s]{2,})/gi"
2021-03-19 01:34:39
此正则表达式不再有效,因为新的自定义 gTLD 可以具有诸如calendar.google 之类的URL
2021-03-21 01:34:39
@augustin-riedinger 如果在前面加上 http 或 httpshttp://docs.google.com它将匹配,因此将匹配但docs.google.com不会匹配
2021-04-02 01:34:39
谁在乎特殊的 www 子域了?没有人!
2021-04-05 01:34:39

这些就是你要找的机器人。这取自validator.js,这是您真正应该用来执行此操作的库。但如果你想自己动手,我是谁来阻止你?如果你想要纯正则表达式,那么你可以去掉长度检查。我认为测试 URL 的长度是个好主意,但如果您真的想确定是否符合规范。

 function isURL(str) {
     var urlRegex = '^(?!mailto:)(?:(?:http|https|ftp)://)(?:\\S+(?::\\S*)?@)?(?:(?:(?:[1-9]\\d?|1\\d\\d|2[01]\\d|22[0-3])(?:\\.(?:1?\\d{1,2}|2[0-4]\\d|25[0-5])){2}(?:\\.(?:[0-9]\\d?|1\\d\\d|2[0-4]\\d|25[0-4]))|(?:(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)(?:\\.(?:[a-z\\u00a1-\\uffff0-9]+-?)*[a-z\\u00a1-\\uffff0-9]+)*(?:\\.(?:[a-z\\u00a1-\\uffff]{2,})))|localhost)(?::\\d{2,5})?(?:(/|\\?|#)[^\\s]*)?$';
     var url = new RegExp(urlRegex, 'i');
     return str.length < 2083 && url.test(str);
}
关于@RubenMartinezJr 的评论的更多信息。- 它确实在 Chrome 和 Firefox (Mac OS)上最大限度地利用了 CPU ,但有趣的,在 Safari 上并没有最大限度地利用 CPU。
2021-03-26 01:34:39
值得一提的是,这可能会使您的浏览器崩溃参见示例:jsfiddle.net/Lrnambtt/9
2021-04-04 01:34:39

另一种可能的解决方案,上述解决方案在解析查询字符串参数时对我来说失败了。

var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\\/\\/(www\\.)?|www\\.){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");

if(regex.test("http://google.com")){
  alert("Successful match");
}else{
  alert("No match");
}

在此解决方案中,请随意修改[-0-9A-Za-z\.@:%_\+~#=,以匹配域/子域名。在这个解决方案中,查询字符串参数也得到了照顾。

如果您没有使用RegEx,则从表达式中替换\\\

希望这可以帮助。

var regex = /^(http[s]?:\/\/(www\.)?|ftp:\/\/(www\.)?|www\.){1}([0-9A-Za-z-\.@:%_\+~#=]+)+((\.[a-zA-Z]{2,3})+)(\/(.)*)?(\?(.)*)?/g; 为我工作
2021-03-21 01:34:39
失败如下:https://www.elhhttp://www.elh虽然@Tony 解决方案通过了这个案例,但它失败了www.elh
2021-04-06 01:34:39
不错的解决方案,但对于foo.co.uk失败了......必须设置为此 var regex = new RegExp("^(http[s]?:\\/\\/(www\\.)?|ftp:\ \/\\/(www\\.)?|(www\\.)?){1}([0-9A-Za-z-\\.@:%_\+~#=]+)+ ((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?"); 谢谢阿马尔。
2021-04-09 01:34:39

我试图将一些 JavaScript 放在一起来验证域名(例如 google.com),如果它验证启用提交按钮。我想我会为那些希望完成类似事情的人分享我的代码。它需要一个没有任何 http:// 或 www 的域。value。该脚本使用从上面剥离的正则表达式进行域匹配,这对假 TLD 并不严格。

http://jsfiddle.net/nMVDS/1/

$(function () {
  $('#whitelist_add').keyup(function () {
    if ($(this).val() == '') { //Check to see if there is any text entered
        //If there is no text within the input, disable the button
        $('.whitelistCheck').attr('disabled', 'disabled');
    } else {
        // Domain name regular expression
        var regex = new RegExp("^([0-9A-Za-z-\\.@:%_\+~#=]+)+((\\.[a-zA-Z]{2,3})+)(/(.)*)?(\\?(.)*)?");
        if (regex.test($(this).val())) {
            // Domain looks OK
            //alert("Successful match");
            $('.whitelistCheck').removeAttr('disabled');
        } else {
            // Domain is NOT OK
            //alert("No match");
            $('.whitelistCheck').attr('disabled', 'disabled');
        }
    }
  });
});

HTML 表格:

<form action="domain_management.php" method="get">
    <input type="text" name="whitelist_add" id="whitelist_add" placeholder="domain.com">
    <button type="submit" class="btn btn-success whitelistCheck" disabled='disabled'>Add to Whitelist</button>
</form>