1

我正在寻找一个正则表达式,它允许我验证字符串是否是对网站地址或该网站中特定页面的引用。

所以它会匹配:

http://google.com
ftp://google.com
http://google.com/
http://lots.of.subdomains.google.com

但不是:

http://google.com/search.whatever
ftp://google.com/search.whatever
http://lots.of.subdomains.google.com/search.whatever

有任何想法吗?我不太清楚如何处理允许/URL 末尾的。

4

3 回答 3

6

试试这个:

(http|ftp|https)://([a-zA-Z0-9\-\.]+)/?
于 2008-10-10T02:38:28.737 回答
5

这是我的完整 URI 验证模式的缩短版本,基于规范。我写这个是因为规范允许许多字符从未包含在我在网络上找到的任何验证模式中。您会看到用户/密码(以及在第二种模式中,路径和查询字符串)比您想象的要宽松得多。

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#                       domain segments AND
)[a-z]{2}[a-z0-9-]*[a-z0-9](?#                              top level domain OR
)|(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5]\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))\/?$/i

而且由于我花时间将其分解为更具可读性,因此这是完整的模式:

/^(https?|ftp):\/\/(?#                                      protocol
)(([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+(?#         username
)(:([a-z0-9$_\.\+!\*\'\(\),;\?&=-]|%[0-9a-f]{2})+)?(?#      password
)@)?(?#                                                     auth requires @
)((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*(?#                       domain segments AND
)[a-z]{2}[a-z0-9-]*[a-z0-9](?#                              top level domain OR
)|(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5]\.){3}(?#
    )(\d|[1-9]\d|1\d{2}|2[0-4][0-9]|25[0-5])(?#             IP address
))(:\d+)?(?#                                                port
))(((\/+([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)*(?# path
)(\?([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)(?#      query string
)?)?)?(?#                                                   path and query string optional
)(#([a-z0-9$_\.\+!\*\'\(\),;:@&=-]|%[0-9a-f]{2})*)?(?#      fragment
)$/i

请注意,某些(全部?)javascript 实现不支持正则表达式中的注释。

于 2008-10-10T06:44:35.013 回答
2

杰里米的回答很好。根据您要匹配的正则表达式方言,您可能希望用锚点包装整个表达式(以避免匹配 URL,例如http://example.com/bin/cgi?returnUrl=http://google.com),并可能概括有效的协议和域名字符:

^\w+://(\w+\.)+\w+/?$
于 2008-10-10T03:45:12.440 回答