Проверка Uri из строки

Мне нужен метод проверки Uri. Итак, строки типа:

"http://www.google.com", "www.google.com", "google.com"

..должно быть подтверждено как Uri. А также обычные строки, такие как "google", не должны быть проверены как Uri. Для этой проверки я использую два метода: UriBuilder и Uri.TryCreate().

проблема с UriBuilder заключается в том, что любая строка, которую я ей даю, возвращает Uri из нее. Когда я передаю нормальную строку в ее конструкторе, она дает ему схему и возвращает "http://google/ " это не то поведение, которое я хочу.

проблема с Uri.TryCreate () - это, пока он работает нормально с"http://www.google.com " и "www.google.com", когда я даю его "google.com" это не подтверждает is как Uri.

Я думал о проверке строки, если она начинается с http: / / или www, отправьте строку в класс UriBuilder, но это не помогает "google.com-который также должен будь Ури.

Как я могу проверить такие вещи, как "google.com" как Uri, но не "google"? Проверка конца строки .com, .net,.организация не кажется гибкой.

4 ответов


public static bool IsValidUri(string uriString)
{
    Uri uri;
    if (!uriString.Contains("://")) uriString = "http://" + uriString;
    if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out uri))
    {
        if (Dns.GetHostAddresses(uri.DnsSafeHost).Length > 0)
        {
            return true;
        }
    }
    return false;
}

то, что вы ищете-это Uri.IsWellFormedUriString. Следующий код возвращает true:

Uri.IsWellFormedUriString("google.com", UriKind.RelativeOrAbsolute)

если вы установите UriKind в абсолют, он возвращает false:

Uri.IsWellFormedUriString("google.com", UriKind.Absolute)

изменить: См.здесь для перечисления UriKind.

  • RelativeOrAbsolute: вид Uri является неопределенным.
  • Абсолют: Uri является абсолютным Uri.
  • относительный: Uri является относительным Uri.

С в MSDN документация:

абсолютные URI характеризуются полной ссылкой на ресурс (пример:http://www.contoso.com/index.html), в то время как относительный Uri зависит от ранее определенного базового URI (пример: /index.формат HTML.)

Также см. здесь на Uri.IsWellFormedUriString. Этот метод работает в соответствии с RFC 2396 и RFC 2732.

если вы посмотрите на RFC 2396, вы увидите, что google.com это недопустимый URI. На самом деле www.google.com не является ни. Но под Ф. Сокращенный URL-Адресов эта ситуация подробно описана следующим образом:

синтаксис URL был разработан для однозначной ссылки на сеть ресурсы и расширяемость через схему URL. Однако, как URL идентификация и использование стали обычным делом, традиционные средства массовой информации (телевидение, радио, газеты, билборды и т. д.) имеют все использовать сокращенные URL-адреса ссылки на литературу. То есть ссылка, состоящая из только части полномочий и пути идентифицированного ресурса, такие как как www.w3.org/Addressing/ или просто имя хоста DNS самостоятельно. Такие ссылки в первую очередь предназначен для интерпретации человеком, а не машиной, с предположение, что контекстная эвристика достаточна для завершения URL (например, большинство имен хостов, начинающихся с "www", вероятно, имеют префикс URL " http://"). Несмотря на то нет стандартного набора эвристика для устранения неоднозначности сокращенных ссылок URL, многие клиенты реализации позволяют вводить их пользователем и эвристически решительный. Следует отметить, что такая эвристика может изменение со временем, особенно при введении новых схем URL. Поскольку сокращенный URL-адрес имеет тот же синтаксис, что и относительный URL-путь, сокращенные ссылки URL не могут использоваться в контекстах, где относительные URL-адреса ожидаются. Этот предел использование сокращенных URL-адресов, мест где нет определенного базового URL, например диалоговых окон и офф-лайн рекламное объявление.

что я понимаю из этого,Uri.IsWellFormedUriString принимает строки, которые имеют форму www.abc.com как действительные URIs. Но ... google.com не принимается как абсолютный URI, тогда как он принимается как относительный URI, потому что он соответствует относительной спецификации пути (пути могут содержать .).

кроме того, в качестве примечания, если вы хотите использовать регулярные выражение для анализа URI, вы можете прочитать B. разбор ссылки URI с регулярным выражением.


Это вариант кода от Jojaba, которому я благодарю за проверку DNS, это было то, что мне нужно. единственная проблема в том, что он использует уловку try в своей логике, которую я надеялся избежать.

        public static Uri StringToAbsoluteUri(string uriString) 
        {
        Uri resultUri = null;

        if (!uriString.Contains(Uri.SchemeDelimiter))
            uriString = Uri.UriSchemeHttp + Uri.SchemeDelimiter + uriString;

        if (Uri.TryCreate(uriString, UriKind.RelativeOrAbsolute, out resultUri))
        {
            try
            {
                IPAddress[] addressesOfHost = Dns.GetHostAddresses(resultUri.DnsSafeHost);
                if (addressesOfHost.Length > 0)
                {
                    return resultUri;
                }
            }
            catch (System.Net.Sockets.SocketException)
            {
                return null;
            }
        }   
        return resultUri;
        }

используйте RegExp для этого.

пример кода проверки URL

Regex RgxUrl = new Regex("(([a-zA-Z][0-9a-zA-Z+\-\.]*:)?/{0,2}[0-9a-zA-Z;/?:@&=+$\.\-_!~*'()%]+)?(#[0-9a-zA-Z;/?:@&=+$\.\-_!~*'()%]+)?");
    if (RgxUrl.IsMatch(<yourURLparameter>))
    {
      //url is valid
    }
    else
    {
      //url is not valid
    }