2015-01-20 14 views
7

im utilizzando il codice come indicato di seguito per verificare la convalida URL:migliore convalida URL

public static bool CheckURLValid(string strURL) 
    { 
     Uri uriResult; 
     return Uri.TryCreate(strURL, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp; 
    } 

Il risultato, come di seguito dovrebbe mostrare tutti come vero, ma in qualche modo ha un proprio modello per convalidare l'url:

falsa: google.com

vero: http://www.google.com

falsa: https://www.google.com.my/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=check%20if%20valid%20url%20c%23

vero: https://stackoverflow.com/questions/ask

im utilizzando C#, come migliorare questa convalida URL di controllo per essere più precisi?

+1

Perché il terzo dovrebbe essere * falso *? È un URL valido e funziona davvero. –

+0

@SriramSakthivel Ho letto la domanda come dovrebbero essere tutte vere, ma il codice mostrato restituisce i risultati sopra riportati, quindi ritengono che anche 3 dovrebbe essere valido. –

+0

sì, si suppone di restituire true, ma in qualche modo la mia funzione lo restituisce come falso :(scusate il mio povero inglese – user3431239

risposta

10

CheckURLValid restituisce esattamente ciò che gli è stato detto.

che restituisca true su tutti e 4 gli URL qui sono i problemi

falsi: google.com

Questo è un URL relativo ed è stata specificata UriKind.Absolute che significa che questo è falso.

falso: https://www.google.com.my/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#newwindow=1&q=check%20if%20valid%20url%20c%23

Si tratta di un protocollo HTTPS (sicuro) URL e il metodo dice

&& uriResult.Scheme == Uri.UriSchemeHttp; 

che limiterà di indirizzi HTTP solo (non protetto)

Per ottenere i risultati si vuole è necessario utilizzare il seguente metodo:

public static bool CheckURLValid(string strURL) 
{ 
    Uri uriResult; 
    return Uri.TryCreate(strURL, UriKind.RelativeOrAbsolute, out uriResult); 
} 

Un'alternativa è usare semplicemente

Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); 

e non riutilizzare la funzionalità che è già pronta. Se si voleva avvolgere il vostro proprio CheckUrlValid vorrei utilizzare il seguente:

public static bool CheckURLValid(string strURL) 
{ 
    return Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); ; 
} 

Il problema principale è che la maggior parte delle stringhe sono valide di URL relativo quindi vorrei evitare di usare UriKind.RelativeOrAbsolute come google.com è un URL non valido . La maggior parte dei browser Web aggiunge silenziosamente HTTP: // alla stringa per renderla un URL valido. HTTP://google.com è un url valido.

+0

grazie per la risposta, io rimango con Absolute. e questo è il mio codice finale: restituisci Uri.TryCreate (strURL, UriKind.Absolute, out uriResult); Faccio un po 'di controllo per garantire agli utenti di digitare "http/https" per poter procedere. – user3431239

3

Si può provare

var isUrl = Uri.IsWellFormedUriString(strURL, UriKind.RelativeOrAbsolute); 

Restituisce vero su tutti e quattro corde che hai scritto nella tua domanda.

+0

thx per la risposta, ho provato 'IsWellFormedUriString' prima di incontrare 'Uri.TryCreate', non mi ha aiutato, perché restituisce il risultato come vero anche se ovviamente non è un url valido. puoi provare a digitare qualsiasi stringa e vedere il risultato, ad esempio: ahskdjfh – user3431239

+0

Il problema è che "google" (o qualsiasi altra stringa che consiste solo di lettere inglesi) e "google.com" sono URL ugualmente validi. Sono entrambi validi come URL relativi, ma non come URL assoluti. – Tonci

+0

Ci sono anche altri problemi. Ad esempio, utilizzando ??? ritornerà vero. (quando si utilizza UriKind.RelativeOrAbsolute o UriKind.Relative) –

0

Questa è la soluzione migliore senza utilizzare Regex:

(si noti che, ad esempio utilizzando solo "IsWellFormedUriString" restituirà true per "//")

public static bool IsValidUrl(string url) 
    { 
     if (url == null) 
     { 
      return false; 
     } 

     try 
     { 
      Uri uriResult = new Uri(url); 
      return Uri.IsWellFormedUriString(url, UriKind.RelativeOrAbsolute); 
     } 
     catch 
     { 
      return false; 
     } 
    } 

Per Unit Testing è possibile controllare il link dove la mia funzione ha ottenuto buoni risultati.

Problemi correlati