Regex для проверки индекса веб-сайта по сравнению с конкретной страницей - PullRequest
1 голос
/ 10 октября 2008

Я ищу регулярное выражение, которое позволило бы мне проверить, является ли строка ссылкой на адрес веб-сайта или конкретной страницей на этом веб-сайте.

Так что будет соответствовать:

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.

Ответы [ 3 ]

6 голосов
/ 10 октября 2008

Попробуйте это:

(http|ftp|https)://([a-zA-Z0-9\-\.]+)/?
5 голосов
/ 10 октября 2008

Это сокращенная версия моего полного шаблона проверки 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 не поддерживают комментарии в регулярных выражениях.

2 голосов
/ 10 октября 2008

Отличный ответ от Джереми. В зависимости от того, какой диалект регулярных выражений вы используете для сопоставления, вы можете захотеть обернуть все выражение якорями (чтобы избежать совпадения URL-адресов, таких как http://example.com/bin/cgi?returnUrl=http://google.com), и, возможно, обобщить действительные символы протокола и имени домена:

^\w+://(\w+\.)+\w+/?$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...