【问题标题】:regex to find url in a text正则表达式在文本中查找 url
【发布时间】:2011-07-24 14:51:28
【问题描述】:

我必须用正则表达式找到文本中的第一个url:

例如:

I love this website:http://www.youtube.com/music it's fantastic

或

[ es. http://www.youtube.com/music] text

【问题讨论】:

标签: javascript regex


【解决方案1】:

我去年研究了这个问题并开发了一个您可能想要查看的解决方案 - 请参阅:URL Linkification (HTTP/FTP) 此链接是 Javascript 解决方案的测试页面,其中包含许多难以链接的 URL 示例。

我为 PHP 和 Javascript 编写的正则表达式解决方案并不简单(但事实证明也不是问题。)有关更多信息,我建议您阅读:

The Problem With URLs 来自 Jeff Atwood,
An Improved Liberal, Accurate Regex Pattern for Matching URLs 来自 John Gruber

如果您想正确执行此操作,则必须阅读 Jeff 博客文章后的 cmets...

请注意,这个问题经常被问到。也许下次再搜索一下:)

【讨论】:

  • 感谢您提供此功能,我发现它非常有用。你有没有机会想出一个类似强大的正则表达式,它可以找到没有前导“http://”的网址,比如“www.example.com”?。
  • @mksuth - 在上面的链接中查看 John Gruber 的正则表达式。它将捕获没有 http:// 的 URL。
【解决方案2】:

你不能用正则表达式完美地做到这一点。您可能对this blog post 感兴趣。 Regex Guru 有更多信息,但即使是那些看起来也很脆弱。您需要在正则表达式之外进行额外检查以捕捉边缘情况。

【讨论】:

  • 我认为更准确的说法是你不能完美地做到这一点,你不能用正则表达式单独做到这一点。 FWIW,Stack Overflow 的 WMD 编辑器使用与 Jeff Atwood 在您的第一个链接中描述的解决方案类似的解决方案,使用正则表达式和各种检查的组合。就像我说的,它不可能是完美的,但由于缺乏更好的解决方案,您不妨使用 99.9% 的时间匹配的东西。
  • 有趣的东西,但我想说“不能这样做”的笼统评论有点强烈。更像是,“99% 的时间都可以做到这一点”:)
  • 我同意你的 cmets。我已经编辑了答案以反映这一点。
【解决方案3】:

识别 URL 很棘手,因为它们通常被标点符号包围,而且用户经常不使用 URL 的完整形式。存在许多用于用超链接替换 ​​URL 的 JavaScript 函数,但我无法在基于 Python 的 Web 框架 Django 中找到与 urlize 过滤器一样有效的函数。因此,我将 Django 的 urlize 函数移植到 JavaScript:https://github.com/ljosa/urlize.js

它实际上不会选择您示例中的 URL,因为 URL 前面有一个冒号。但是如果我们稍微修改一下这个例子:

urlize("I love this website: http://www.youtube.com/music it's fantastic", true, true)
=> 'I love this website: <a href="http://www.youtube.com/music" rel="nofollow">http://www.youtube.com/music</a> it&#39;s fantastic"'

注意第二个参数,如果为真,则插入rel="nofollow",第三个参数,如果为真,则引用在 HTML 中具有特殊含义的字符。

【讨论】:

    【解决方案4】:

    这可能行得通->

    \b(([\w-]+://?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))
    

    在某处找到它

    会找到链接->

    http://foo.com/blah_blah/

    (类似于http://foo.com/blah_blah)

    http://foo.com/blah_blah_(wikipedia)

    希望这行得通....

    【讨论】:

      【解决方案5】:

      我正在使用这个正则表达式::)(它的翻译 ABNF)

      [a-zA-Z]([a-zA-Z]|[0-9]|\+|\-|\.)*:\/\/((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:)*@)?(\[((([0-9A-Fa-f]{1,4}:){6}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|::([0-9A-Fa-f]{1,4}:){5}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|([0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){4}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,1}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){3}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,2}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:){2}([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,3}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}:([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,4}[0-9A-Fa-f]{1,4})?::([0-9A-Fa-f]{1,4}:[0-9A-Fa-f]{1,4}|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9]))|(([0-9A-Fa-f]{1,4}:){0,5}[0-9A-Fa-f]{1,4})?::[0-9A-Fa-f]{1,4}|(([0-9A-Fa-f]{1,4}:){0,6}[0-9A-Fa-f]{1,4})?::)|v[0-9A-Fa-f]\.(([a-zA-Z]|[0-9]|-|\.|_|~)|[!$&'\(\)\*\+,;=]|:))\]|(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=])*)(:[0-9]*)?(((\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*|\/((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*)?|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*|(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|@){1}(\/(([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)*)*))?\/?(\?((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?(\#((([a-zA-Z]|[0-9]|-|\.|_|~)|%[0-9A-Fa-f][0-9A-Fa-f]|[!$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?
      

      【讨论】:

        【解决方案6】:

        您可以使用以下正则表达式来提取消息中的任何类型的 url。

        String regex = "(http(s)?:\/\/.)?(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&/=]*)";
        

        【讨论】:

          【解决方案7】:

          Typescript/Angular

          这对我有用:

          const regExpressionUrl = new RegExp(/(https?:\/\/[^\s]+)/g); //detect URL
          

          参考: https://www.regextester.com/96249%7CRegular

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-01-30
            • 1970-01-01
            • 1970-01-01
            • 2016-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多