What is a good regular expression to match a URL?
本问题已经有最佳答案,请猛点这里访问。
目前我有一个输入框,它将检测URL并分析数据。
所以现在,我正在使用:
1 2 3 | var urlR = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+) (?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/; var url= content.match(urlR); |
问题是,当我输入像
我的正则表达式不是很流利。有人能帮我吗?
regex如果要确保URL以http/https开头:
1 | https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*) |
如果不需要HTTP协议:
1 | [-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*) |
要尝试此操作,请访问http://regexr.com?37i6s,或者对于限制较少的版本http://regexr.com/3e6M0。
示例javascript实现:
1 2 3 4 5 6 7 8 9 | var expression = /[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[a-z]{2,4}\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"); } |
1 | (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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | 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("Success:" + entry +"" ); } else { $("#output").append("Fail:" + entry +"" ); } }); |
1 | <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"> |
在Rubula中查看-新版本
在rubular-old version中检查
这些是你要找的机器人。这是从validator.js中获取的,它是您真正应该使用的库。但如果你想自己滚,我是谁来阻止你?如果你想要纯regex,那么你只需要进行长度检查。我认为测试URL的长度是个好主意,不过如果您真的想确定是否符合规范的话。
1 2 3 4 5 | 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); } |
另一个可能的解决方案,上面的解决方案在分析查询字符串参数时失败。
1 2 3 4 5 6 7 | 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"); } |
在此解决方案中,请随意修改
如果不使用
希望这有帮助。
试试这个
1 | (ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))? |
我试着用一些javascript来验证域名(例如google.com),如果它验证了,就启用提交按钮。我想我会为那些想要完成类似任务的人分享我的代码。它需要一个没有http://或www.value的域。该脚本使用上面的一个简化的正则表达式进行域匹配,这对伪TLD并不严格。
http://jsfiddle.net/nmvds/1/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | $(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表单:
1 2 3 4 | <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> |