0

我已经修改了我在这里找到的一个正则表达式,以便它可以接受各种英国和二级 TLD。

/\b((?:^https?:\/\/|^[a-z0-9.\-]+[.][a-z]{2,4})(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!@()\[\]{};:'".,<>?]))/i

但是,正如您在我的测试数据中看到的那样正则表达式匹配 URL,例如www.zapple.@comhttps://m!crosoft.com无效。

由于某种原因@,符号在 the 之前被排除在外,.com但在 the 之后.却没有。

根本不排除感叹号,这令人困惑,因为据我所知,句号之前只允许使用字母、数字和破折号。

4

1 回答 1

2

@ 匹配于

[^\s()<>]+

和!标记为

(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+

我不知道,但这看起来不像是匹配 url 的好正则表达式

根据 RFC 3986 尝试以下匹配 url 绝对和相对 url'sare 支持。

将不区分大小写设置为 true

^
(# 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\-._~%!$&'()*+,;=:@/?]*)?
$

更新 1

这不匹配 m!crosoft.com 和 @pple.com 这可能是由于与 Rublar 的关系。

在此处输入图像描述

于 2012-06-09T00:17:10.770 回答