При необходимости добавьте схему в 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?
Что-то элегантное и быстрое?
Ответы
Ответ 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://");