在文本字符串中查找任何与Twitter使用完全相同的URL

时间:2012-06-18 21:19:34

标签: javascript regex twitter

有许多类似的问题,但他们没有回答没有www.http://等网址的问题。我要做的是检查字符串是否有问题包含一个包含任何类型网址的网址。当您提交推文时Twitter会这样做。

可接受的网址包括但不限于:

我试过Daring Fireball&的两个正则表达式This question

var regex = /\b((?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\"\\.,<>?\u00AB\u00BB\u201C\u201D\u2018\u2019]))/i;

var regex = /(?:<\w+.*?>|[^=!:'"\/]|^)((?:https?:\/\/|www\.)[-\w]+(?:\.[-\w]+)*(?::\d+)?(?:\/(?:(?:[~\w\+%-]|(?:[,.;@:][^\s$]))+)?)*(?:\?[\w\+%&=.;:-]+)?(?:\#[\w\-\.]*)?)(?:\p{P}|\s|<|$)/;

以下是我正在进行的测试示例:http://jsfiddle.net/3Wn26/5/

4 个答案:

答案 0 :(得分:4)

我认为没有一种可靠的方法(随着时间的推移)。现在new gTLDs are coming,它很难跟上。无论如何,我试了一下。

/
  (
    \b
      (?:(https?|ftp):\/\/)?
      (
        (?:www\d{0,3}\.)?
        (
          [a-z0-9.-]+\.
          (?:[a-z]{2,4}|museum|travel)
          (?:\/[^\/\s]+)*
        )
      )
    \b
  )
/ix

捕获组

  1. 整个网址,例如:http://www.google.com/anyquerystringSAY/Rfy/srA/yh
  2. 协议,例如:http
  3. 包含www.的网址,例如:www.google.com/swrua8rua8rUWRWAURHAJSrjuhFAhjT/Rtgfsbdh
  4. 不包括www.的网址,例如:google.com/sarwar8wa8r/R/A(R8images.google.com/w9r89w9ar8a9sjfriJRIUS(RY/(YUr
  5. 或者,您可以将(?:[a-z]{2,4}|museum|travel)位替换为所有ones listed here,但该列表永远不会停止增长,所以我怀疑它是值得的。 (你可以看到我添加了两个例外博物馆旅行。)

    另请注意我添加了ftp,如果您不需要它,请随时删除它。

    希望这有帮助。

    See it in action

答案 1 :(得分:1)

(# Scheme
 [a-z][a-z0-9+\-.]*:
 (# Authority & path
  //
  ([a-z0-9\-._~%!$&'()*+,;=]+@)?              # User
  ([a-z0-9\-._~%]+                            # Named host
  |\[[a-f0-9:.]+\]                            # IPv6 host
  |\[v[a-f0-9][a-z0-9\-._~%!$&'()*+,;=:]+\])  # IPvFuture host
  (:[0-9]+)?                                  # Port
  (/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?          # Path
 |# Path without authority
  (/?[a-z0-9\-._~%!$&'()*+,;=:@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?)?
 )
|# Relative URL (no scheme or authority)
 ([a-z0-9\-._~%!$&'()*+,;=@]+(/[a-z0-9\-._~%!$&'()*+,;=:@]+)*/?  # Relative path
 |(/[a-z0-9\-._~%!$&'()*+,;=:@]+)+/?)                            # Absolute path
)
# Query
(\?[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?
# Fragment
(\#[a-z0-9\-._~%!$&'()*+,;=:@/?]*)?

RFC 3986。 验证字符串是否包含RFC 3986中指定的URL。支持绝对和相对URL。

答案 2 :(得分:0)

答案是 - 你做不到。

例如,Twitter将歌手Will.I.Am的名称视为URL(.am 是有效的tld)。

如果不知道每个tld的所有域名注册规则,就无法知道网址是否有效 没有 测试。

我建议你这样做。

  1. 对你的剧本慷慨。几乎接受任何带有“。”的字符串。在它。
  2. 执行HTTP HEAD请求以查看该网址是否存在。
  3. 执行WHOIS以查看域名是否已注册(即使确切的网址不匹配)
  4. 当然,这并没有考虑到有人可能已经发布了一个指向他们内联网的链接 - 这对他们的一些粉丝来说很有用。

答案 3 :(得分:0)

我的名为FuncJS的简单JavaScript库有一个名为“findLinks()”的函数,它应该能够完成您想要的任务。

假设你有一个包含链接的字符串,只需包含在函数参数中,如下所示:

findLinks("Visit my website at http://website.com and visit my profile on Twitter at http://twitter.com/yourProfile!");

然后使用各种方法输出它,例如document.write,输出的字符串应突出显示链接。

要更好地了解此功能,请阅读http://docs.funcjs.webege.com/findLinks().html上的文档。

希望这可以帮助你和其他任何想要这样做的人! :)