1

有许多类似的问题,但是他们没有回答 url 没有 , 等的问题www.http://我要做的是检查字符串是否包含具有任何类型 url 的 url。Twitter 在您提交推文时执行此操作。

可接受的 URL 包括但不限于:

我从Daring Fireball这个问题中尝试过的两个正则表达式:

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

4 回答 4

4

我认为没有一种可靠的方法(随着时间的推移)。既然新 gTLD 即将到来,就很难跟上。无论如何,我试了一下。

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

捕获组

  1. 整个 URL,例如:http://www.google.com/anyquerystringSAY/Rfy/srA/yh
  2. 协议,例如:http
  3. 网址包括www.,例如:www.google.com/swrua8rua8rUWRWAURHAJSrjuhFAhjT/Rtgfsbdh
  4. URL 不包括www., ex:google.com/sarwar8wa8r/R/A(R8images.google.com/w9r89w9ar8a9sjfriJRIUS(RY/(YUr

或者,您可以用此处列出(?:[a-z]{2,4}|museum|travel)的所有位替换该位,但该列表永远不会停止增长,所以我怀疑它是否值得。(你可以看到我添加了两个例外博物馆旅行。)

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

希望这可以帮助。

看到它在行动

于 2012-06-18T22:05:30.020 回答
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。

于 2012-06-18T21:50:37.520 回答
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上的文档。

希望这对您和其他想要这样做的人有所帮助!:)

于 2012-11-24T00:38:28.207 回答
0

答案是——你不能。

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

如果不了解每个 tld 的所有域注册规则,就无法知道 URL 是否有效而无需测试。

这是我建议你做的。

  1. 对你的剧本大方一点。接受几乎所有带有“.”的字符串 在里面。
  2. 执行HTTP HEAD请求以查看 URL 是否存在。
  3. 执行WHOIS以查看域是否已注册(即使确切的 URL 不匹配)

当然,这并没有考虑到有人可能已经发布了指向他们的 Intranet 的链接——这对他们的一些追随者有用。

于 2012-06-19T07:58:39.677 回答