Regex验证网站索引与特定页面的索引

Regex验证网站索引与特定页面的索引,regex,url,Regex,Url,我正在寻找一个正则表达式,它允许我验证字符串是否是对网站地址或该网站中特定页面的引用 因此,它将匹配: 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.c

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

因此,它将匹配:

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末尾使用
/

试试这个:

(http|ftp|https)://([a-zA-Z0-9\-\.]+)/?
试试这个:

(http|ftp|https)://([a-zA-Z0-9\-\.]+)/?

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

^\w+://(\w+\.)+\w+/?$

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

^\w+://(\w+\.)+\w+/?$

这是我的完整URI验证模式的缩短版本,基于。我写这篇文章是因为规范允许许多字符从未包含在我在web上找到的任何验证模式中。您将看到user/pass(以及在第二种模式中的path和query字符串)的权限比您想象的要大得多

/^(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实现不支持正则表达式中的注释。

这是我的完整URI验证模式的缩写版本,基于。我写这篇文章是因为规范允许许多字符从未包含在我在web上找到的任何验证模式中。您将看到user/pass(以及在第二种模式中的path和query字符串)的权限比您想象的要大得多

/^(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实现不支持正则表达式中的注释。

请记住,如果您使用php来转义“/”或正则表达式将无法编译:),谢谢Jeremy!这就是诀窍@LaQuet-我实际上是在javascript中使用它的,但是谢谢你的提醒。记住,如果你使用php来转义“/”或者正则表达式将不会编译:)谢谢Jeremy!这就是诀窍@LaQuet-我实际上是在javascript中使用这个,但是谢谢你的提醒。哇,谢谢你出色的回答。我认为这对我来说太过分了——我使用这个正则表达式更多的是作为对用户的警告,而不是要求,所以我更喜欢简单的版本。但这绝对是一个很好的资源。我很欣赏这些好话。我很好奇为什么你会选择一个能力较弱的?如果没有别的,除了根据规范编写之外,它还允许IP地址和端口,对于用户提交的URL来说,这两种情况都不常见。哇,谢谢你的出色回答。我认为这对我来说太过分了——我使用这个正则表达式更多的是作为对用户的警告,而不是要求,所以我更喜欢简单的版本。但这绝对是一个很好的资源。我很欣赏这些好话。我很好奇为什么你会选择一个能力较弱的?如果没有其他内容的话,除了根据规范编写之外,它还允许使用IP地址和端口,这两种情况对于用户提交的URL来说都不常见。