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

big*_*bob 323 javascript regex

目前我有一个输入框,可以检测URL并解析数据.

所以现在,我正在使用:

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

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

我的正则表达式不是很流利.谁能帮我?

Dav*_*veo 512

如果要确保URL以HTTP/HTTPS启动,请使用正则表达式:

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

如果您不需要HTTP协议:

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

要试一试,请参阅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");
}
Run Code Online (Sandbox Code Playgroud)

  • 有必要提一下使用这个网站http://gskinner.com/RegExr/来测试Regex并查看常见样本 (18认同)
  • 问题 - 为什么最后一个字符类中的双斜杠?在正则表达式的这一部分[-a-zA-Z0-9 @:%_\+.〜#?&// =]中有一个双斜线,这对我来说似乎没有必要?你在字符类中放置两个相同的字符,如果你打算逃避正常的斜线,这将是徒劳的,因为使用反斜杠执行转义?... (13认同)
  • 这仍然匹配没有有效TLD的URL,即:"http://foo/file.html" (7认同)
  • regex.test('//.com')=> true (6认同)
  • 如果url有空格,则不起作用。t ='www.google.com withspace't.match(regex)//返回true (3认同)
  • Diego Perini 制作了一个非常好的正则表达式,涵盖了几乎所有可能的情况,您可能想在这里查看:https://mathiasbynens.be/demo/url-regex (3认同)
  • 在这里查看http://regexr.com?2s81g你可以在示例文本中看到与URL正则表达式匹配的蓝色突出显示 (2认同)
  • 以下是@ Daveo的正则表达式的精致版本,对我来说是最好的:https://regex101.com/r/hU9aV3/2 (2认同)
  • 这不适用于“http://localhost:60001/#/tab/dash”。/[-a-zA-Z0-9@:%_\+.~#?&//=]{2,256}\.[az]{2,4}\b(\/[-a-zA-Z0 -9@:%_\+.~#?&//=]*)?/gi.test('http://localhost:60001/#/tab/dash'); 错误的 (2认同)
  • 这对于`http://12.23.12.23:8080/example'无效,但有效 (2认同)
  • 这不会将 `localhost` 检测为 URL。 (2认同)
  • 我对最后一组中的`//`感到困惑。应该是`\/`吗? (2认同)
  • 由于 6 个字母结尾限制,不适用于 https://mysite.restaurant 等新网址。我认为应该是 18,因为例如。`.northwesternmutual`。从“https://en.wikipedia.org/wiki/List_of_Internet_top-level_domains”获取列表 (2认同)

fou*_*fos 172

(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,})
Run Code Online (Sandbox Code Playgroud)

将符合以下情况

  • 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>" );
  }
});
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="output"></div>
Run Code Online (Sandbox Code Playgroud)

用rubular检查它 - 新版本

用rubular检查它 - 旧版本

  • 谁再关心特殊的www子域了?没有人! (13认同)
  • 此正则表达式不再有效,因为新的自定义gTLD可以包含h​​ttps://calendar.google/等网址 (7认同)
  • 但它将匹配`http:// www.foufos`并且不匹配`regex.com` (5认同)
  • 我稍微改变了你的表达方式,这样它就可以在我需要的所有情况下工作,包括带有 http:// 或 http://www "/([^\s\.]+\.[^\s]{2, }|www\.[^\s]+\.[^\s]{2,})/gi" (2认同)
  • @ augustin-riedinger如果http或https被添加,它将匹配,因此`http:// docs.google.com`将匹配,但'docs.google.com`将不匹配 (2认同)

Mic*_*nor 47

这些是您正在寻找的机器人.这是从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);
}
Run Code Online (Sandbox Code Playgroud)

  • 值得一提**这会让您的浏览器崩溃**.参见示例:http://jsfiddle.net/Lrnambtt/9/ (8认同)
  • 有关@RubenMartinezJr的评论的更多信息。-它*最大限度地*减少了Chrome和Firefox(Mac OS)上的CPU使用率,但有趣的是*没有*最大限度地使Safari上的CPU使用了内存。 (2认同)

Ama*_*ure 23

另一个可能的解决方案,上面的解决方案在解析查询字符串参数时失败了.

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");
}
Run Code Online (Sandbox Code Playgroud)

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

如果你没有使用RegEx,那么从表达式替换\\\.

希望这可以帮助.

  • 很好的解决方案但http://foo.co.uk失败...必须设置为此var regex = new RegExp("^(http [s]?:\\/\\ /(www \\.)? |的ftp:\\/\\/|(WWW \\.)){1}([0-9A-ZA-Z - \\ @(WWW \\.):?%_\+〜#= ] +)+((\\ [A-ZA-Z] {2,3}.)+)(/(.)*)(\\(?)*)")?; 谢谢Amar. (4认同)
  • `var regex = /^(http[s]?:\/\/(www\.)?|ftp:\/\/(www\.)?|www\.){1}([0-9A- Za-z-\.@:%_\+~#=]+)+((\.[a-zA-Z]{2,3})+)(\/(.)*)?(\? (.)*)?/g;` 对我有用 (3认同)

Rom*_*man 10

试试这个

(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

554048 次

最近记录:

6 年,5 月 前