Регулярное выражение проверки URL позволяет один случай, который я бы хотел запретить - PullRequest
0 голосов
/ 18 июля 2011

Вот мое регулярное выражение:

^(?#Protocol)((ht)tp(s?)\:\/\/|~\/|\/){1}((?#IP Address)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?#Subdomains)(([-\w]+\.)+(?#TopLevel Domains))([a-z]+))(?#Port)(:[\d]{1,5})?(\/\S*)*$

Он разрешает этот URL, но я бы хотел, чтобы он запретил http://10.10.10.10.comasdf.

Может кто-нибудь помочь мне понять, где это неправильно?

BTW, the following URLs are (correctly) allowed by the regex:

http://www.google.com
http://google.com
http://www.google.COM
http://google.co
http://www.google.c
http://www.google.biz
http://www.google.edu
http://android.google.com
http://www.google.com.asdf
http://android.google.com.jp
http://www.google.michael
http://www.mysite10.com
http://10mysite.com
http://209.85.148.103
http://209.85.148.103:8080
http://www.google.com:8080
http://www.google.japan
http://209.85.148.103/asdf
http://www.google.japan/asdf
http://www.google.japan/asdf/xcvb
http://209.85.148.103/asdf/xcvb
http://www.google.japan/asdf10/xcvb
http://209.85.148.103/asdf10/xcvb
http://www.google.japan/asdf10/xcvb30grts
http://209.85.148.103/asdf10/xcvb30grts
http://209.85.148.103/asdf10#xcvb30grts
http://www.google.japan/asdf10#xcvb30grts

1 Ответ

0 голосов
/ 18 июля 2011

Когда ваш IP-адрес не совпадает, он пытается соответствовать условию |. И это успешно, потому что 10.10.10.10.comasdf соответствует ([-\w]+\.)+([a-z]+)

Попробуйте поставить ?> перед (?#IP Address). Таким образом, когда IP-адрес совпадает, он не будет пытаться выполнить |(?#Subdomains)(([-\w]+\.)+(?#TopLevel Domains))([a-z]+) после сбоя (?#Port)(:[\d]{1,5})?(\/\S*)*$

^(?#Protocol)((ht)tp(s?)\:\/\/|~\/|\/){1}(?>(?#IP Address)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})|(?#Subdomains)(([-\w]+\.)+(?#TopLevel Domains))([a-z]+))(?#Port)(:[\d]{1,5})?(\/\S*)*$

См .: http://regexr.com? 2u8ks

...