Подтверждение Uri из строки - PullRequest
       11

Подтверждение Uri из строки

9 голосов
/ 09 сентября 2010

Мне нужен метод проверки 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 ", это не такvalidate как Uri.

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

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

Ответы [ 4 ]

17 голосов
/ 09 сентября 2010

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

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

Если для UriKind установлено значение Absolute, возвращается false:

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

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

  • RelativeOrAbsolute: тип 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 не является ни тем, ни другим, но в разделе F. Сокращенные 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 в качестве действительных URI. Но google.com не принимаетявляется абсолютным URI, тогда как он принимается как относительный URI, поскольку он соответствует спецификации относительного пути (пути могут содержать.).

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

5 голосов
/ 09 сентября 2010
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;
}
3 голосов
/ 09 сентября 2010

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

        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;
        }
2 голосов
/ 09 сентября 2010

используйте для этого 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
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...