Подтвердить что ты не робот

При необходимости добавьте схему в URL

Чтобы создать Uri из строки, вы можете сделать это:

Uri u = new Uri("example.com");

Но проблема в том, что строка (например, выше) не содержит протокол, вы получите исключение: "Invalid URI: The format of the URI could not be determined."

Чтобы избежать исключения, вы должны убедиться, что строка содержит протокол, например:

Uri u = new Uri("http://example.com");

Но если вы берете url в качестве входных данных, как вы можете добавить протокол, если он отсутствует? Я имею в виду, кроме некоторых манипуляций IndexOf/Substring?

Что-то элегантное и быстрое?

4b9b3361

Ответ 1

Вы также можете использовать UriBuilder:

public static Uri GetUri(this string s)
{
    return new UriBuilder(s).Uri;
}

Заметки из MSDN:

Этот конструктор инициализирует новый экземпляр класса UriBuilder с параметрами Fragment, Host, Path, Port, Query, Scheme и Uri, указанными в uri.

Если uri не указывает схему, схема по умолчанию имеет значение "http:".

Ответ 2

Если вы просто хотите добавить схему, не проверяя URL-адрес, самым быстрым/простым способом является использование поиска строк, например:

string url = "mydomain.com";
if (!url.StartsWith("http://", StringComparison.OrdinalIgnoreCase)) url = "http://" + url;

Лучшим подходом было бы использовать Uri, чтобы также проверить URL-адрес с помощью TryCreate метод:

string url = "mydomain.com";
Uri uri;
if ((Uri.TryCreate(url, UriKind.Absolute, out uri) || Uri.TryCreate("http://" + url, UriKind.Absolute, out uri)) &&
    (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))
{
    // Use validated URI here
}

Как отметил @JanDavidNarkiewicz в комментариях, проверка Scheme необходима для защиты от недействительных схем, когда порт указан без схемы, например. mydomain.com:80.

Ответ 3

Мое решение состояло в том, что для протокалов меньше URL-адресов, чтобы убедиться, что у них есть протокальное регулярное выражение:

Regex.Replace(s, @"^\/\/", "http://");