Регулярное выражение URL

Дата: 6.01.2010
Категории: ASP.NET Visual Studio (C#)

Иногда в веб-приложении необходимо реализовать получение URL от пользователя. Это не очень сложно, но и не так просто как может показаться, ведь пользователь может ввести что угодно. Требуется проверить введенный пользователем URL на корректность. Поможет нам в этом регулярное выражение.

С помощью регулярных выражений можно проверить что угодно, например, можно проверить валидность e-mail, IP адрес, телефонный номер, ZIP код, и даже имя. Вот небольшая коллекция полезных регулярных выражений и пример программной реализации одного из них на C#.

Мы будем использовать специальный элемент управления — RegularExpressionValidator. Если вам нужен пример программной реализации, т.е. прямо в коде в виде функции, то по ссылке выше вы можете найти очень хороший пример.

Регулярное выражение

^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,
\'\/\\\+&%\$#_]*)?$

Выглядит и правда эффектно. Но у этого регулярного выражения есть несколько минусов. Мне больше понравилось это:

^(?#Protocol)(?:(?:ht|f)tp(?:s?)\:\/\/|~\/|\/)?(?#Username:Password)(?:\w+:\w+@)
?(?#Subdomains)(?:(?:[-\w]+\.)+(?#TopLevel Domains)(?:com|org|net|gov|mil|biz|
info|mobi|name|aero|jobs|museum|travel|[a-z]{2}))(?#Port)(?::[\d]{1,5})?
(?#Directories)(?:(?:(?:\/(?:[-\w~!$+|.,=]|%[a-f\d]{2})+)+|\/)+|\?|#)?(?#Query)
(?:(?:\?(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)(?:&
(?:[-\w~!$+|.,*:]|%[a-f\d{2}])+=?(?:[-\w~!$+|.,*:=]|%[a-
f\d]{2})*)*)*(?#Anchor)(?:#(?:[-\w~!$+|.,*:=]|%[a-f\d]{2})*)?$

Это вообще сложное, учитывает даже доменную зону. Но выбирать вам.

Реализация

Выкладываем TextBox. В него будет писаться URL. Изменяем его ID на tbUrl. Код выглядит так:

URL: <asp:TextBox ID="tbUrl" runat="server">http://</asp:TextBox>

Затем, выкладываем (например, перед TextBox) контрол RegularExpressionValidator и устанавливаем свойства:

1. ErrorMessage=Введите корректный URL
Это сообщение которое будет показываться в случае неверного URL

2. ValidationExpression=^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\’\/\\\+&%\$#_]*)?$
Это само регулярное выражение. Будем пользоваться первым.

3. ControlToValidate=tbUrl
Тут указываем ID компонента (в нашем случае ID TextBox’а) из которого будет браться проверяемая информация.

4. Display=Dynamic
Говорим, что проверка будет осуществляться динамически, т.е. после потери фокуса контрола. На мой взгляд это удобнее для пользователя.

Результат

В итоге код будет выглядеть примерно так:

<asp:RegularExpressionValidator ID="RegularExpressionValidator1" runat="server"
     ErrorMessage="Введите корректный URL"
     ValidationExpression="^(ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*
         (:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&amp;%\$#_]*)?$"
     ControlToValidate="tbUrl" Display="Dynamic" />
<br />
URL: <asp:TextBox ID="tbUrl" runat="server">http://</asp:TextBox>

Ну вот и все, запускайте и проверяйте. Кстати, верным будет, например такой URL:
http://www.TechWeek.ru/

Коментарии:

  1. 05.04.2015 в 03:26

    (ht|f)tp(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,
    \’\/\\\+&%\$#_]*)?

    не корректно взаимодействует со ссылкой

    yandex.ru/yandsearch?text=%D1%80%D0%B5%D0%B3%D1%83%D0%BB%D1%8F%D1%80%D0%BD%D0%BE%D0%B5%20%D0%B2%D1%8B%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5%20url%20%D1%81%20ip

    Хром открывает эту ссылку. Регулярка пропускает. Не правильно составлена