2014-09-25 4 views
1

Я использую класс Uri для разработки приложений и нуждаюсь в первом сегменте введенного пользователем uri, который либо содержит http: //, либо http: // или ftp: // и т. д. Если это не так, мне нужно жестко установить его.Как извлечь первый сегмент из URI с использованием класса Uri

Я уже искал его, используя googling и stackoverflowing, но они не показали точного требования для меня.

string path,downloadURL; 
path = this.savePath.Text; 
downloadURL = this.downloadURL.Text; 

// i have done this but it didn't check if already existing . 
downloadURL = "http://" + downloadURL; 

Uri tmp = new Uri(downloadURL); 
//extracts the last element 
string EndPathFileName = tmp.Segments.Last(); 

// something like this but it returns only '/'. 
//string StartPathFileName = tmp.Segments.First(); 

//Console.WriteLine(StartPathFileName); 

Любые предложения?

ответ

1

Ну есть несколько вариантов, в зависимости от того, что поведение, которое вы хотите ...

Вы могли бы просто проверить, если он содержит ://, которые могли бы быть достаточно для того, что вы хотите:

if(!downloadURL.Contains("://")) 
    downloadURL = "http://" + downloadURL; 

Обратите внимание, что это позволит такие вещи, как "rubbish://www.example.com"


Если вы хотите быть немного более осторожным, вы можете проверить, если строка начинается с одно из ваших предопределенных значений. Например:

if(!downloadURL.StartsWith("http://") && !downloadURL.StartsWith("https://") && !downloadURL.StartsWith("ftp://")) 
    downloadURL = "http://" + downloadURL; 

Хотя это будет означать, что "rubbish://www.example.com" станет "http://rubbish://www.example.com".

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


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

string[] approvedSchemes = new string[] { "http", "https", "ftp" }; 
string userScheme = ""; 

if(downloadURL.Contains("://")) 
{ 
    // Get the first scheme defined, we will use this if it is in the approved list. 
    userScheme = downloadURL.Substring(0, downloadURL.IndexOf("://")); 
    // To cater for multiple :// remove all of them 
    downloadURL = downloadURL.Substring(downloadURL.LastIndexOf("://") + 3); 
} 

// Check if the user defined scheme is in the approved list, if not then set to http. 
if(Array.IndexOf(approvedSchemes, userScheme.ToLowerInvariant()) > -1) 
    downloadURL = userScheme + "://" + downloadURL; 
else 
    downloadURL = "http://" + downloadURL; 

Here is a working example

+0

Удивительный вы кодифицированного мою мысль !!! – 2014-09-25 09:39:31

0

Вы должны использовать Uri.Scheme Property

Uri baseUri = new Uri("http://www.contoso.com/"); 
    Console.WriteLine(baseUri.Scheme); //http 

    Uri anotherUri = new Uri("https://www.contoso.com/"); 
    Console.WriteLine(anotherUri.Scheme); //https 
Смежные вопросы