Нужно C # регулярное выражение для проверки URL - PullRequest
1 голос
/ 15 декабря 2009

Как проверить с помощью одного регулярного выражения URL-адреса:

http://83.222.4.42:8880/listen.pls
http://www.my_site.com/listen.pls
http://www.my.site.com/listen.pls

чтобы быть правдой?

Я вижу, что я сформулировал вопрос не совсем :(, извините, моя ошибка. Идея состоит в том, что я хочу проверить с помощью регулярных выражений regexp, пусть это будет внешний IP-адрес или имя домена. идея, другие действительные URL могут быть рассмотрены:

http://93.122.34.342/
http://193.122.34.342/abc/1.html
http://www.my_site.com/listen2.pls
http://www.my.site.com/listen.php

и т. Д.

Ответы [ 6 ]

7 голосов
/ 15 декабря 2009

Дорога в ад вымощена разбором строк.

Парсинг URL, в частности, является источником множества проблем безопасности. Не делай этого.

Например, хотите ли вы, чтобы это совпадало?

    

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

Начните с использования System.Uri для анализа предоставленных вами URL:

var uri = new Uri("http://83.222.4.42:8880/listen.pls");

Тогда вы можете написать что-то вроде:

if (uri.Scheme == "http" &&
    uri.Host == "83.222.4.42" &&
    uri.AbsolutePath == "/listen.pls"
    )
{
    // ...
}
1 голос
/ 15 декабря 2009

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

В будущем, если вы захотите добавить дополнительные URL-адреса в список, вы, скорее всего, получите слишком сложное регулярное выражение, которое становится все труднее поддерживать и которое заменяет более простую проверку небольшого списка.

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

Примечание: Если вы хотите использовать регулярные выражения, попробуйте веб-сайты, на которых размещаются библиотеки, такие как Regex Library - есть множество вариантов на выбор, если ваши потребности изменятся.

1 голос
/ 15 декабря 2009

^ Http: //.+/listen \ .pls $

1 голос
/ 15 декабря 2009
/^http:\/\/[-_a-zA-Z0-9.]+(:\d+)?\/listen\.pls$/
1 голос
/ 15 декабря 2009

Вы имеете в виду какой-либо URL, заканчивающийся /listen.pls? В этом случае попробуйте это:

^http://[^/]+/listen\.pls$

или если идентификатор протокола должен быть необязательным:

^[http://]?[^/]+/listen\.pls$

В любом случае, посмотрите здесь, может быть, это будет полезно для вас: Проверка URL и электронной почты с использованием Regex

0 голосов
/ 17 декабря 2009

Модифицированная версия базируется на решении Джея Базузи выше, так как я не могу публиковать код в комментариях, он проверяет расширения из черного списка (я делаю это только для демонстрационных целей, вам настоятельно рекомендуется создать белый список а не в черный список):

string myurl = "http://www.my_site.com/listen.pls";
Uri myUri = new Uri(myurl);
string[] invalidExtensions = {
    ".pls",
    ".abc"
};

foreach(string invalidExtension in invalidExtensions) {
    if (invalidExtension.ToLower().Equals(System.IO.Path.GetExtension(myUri.AbsolutePath))) {
        //Logic here
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...