Esistono i metodi Uri.IsWellFormedUriString
e Uri.TryCreate
, ma sembrano tornare true
per i percorsi dei file, ecc.
Come posso verificare se una stringa è un URL HTTP valido (non necessariamente attivo) ai fini della convalida dell'input?
Esistono i metodi Uri.IsWellFormedUriString
e Uri.TryCreate
, ma sembrano tornare true
per i percorsi dei file, ecc.
Come posso verificare se una stringa è un URL HTTP valido (non necessariamente attivo) ai fini della convalida dell'input?
Risposte:
Prova questo per convalidare gli URL HTTP ( uriName
è l'URI che vuoi testare):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& uriResult.Scheme == Uri.UriSchemeHttp;
Oppure, se si desidera accettare entrambi gli URL HTTP e HTTPS come validi (secondo il commento di J0e3gan):
Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
Questo metodo funziona bene sia in http che in https. Solo una riga :)
if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))
MSDN: IsWellFormedUriString
file://
o ldap://
. Questa soluzione dovrebbe essere accoppiata con un controllo rispetto allo schema - ad esempioif (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
public static bool CheckURLValid(this string source)
{
Uri uriResult;
return Uri.TryCreate(source, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp;
}
Uso:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
AGGIORNAMENTO: (singola riga di codice) Grazie @GoClimbColorado
public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;
Uso:
string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
//valid process
}
Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
Tutte le risposte qui consentono gli URL con altri schemi (ad es. file://
, ftp://
) O rifiutano gli URL leggibili dall'uomo che non iniziano con http://
o https://
(ad es. www.google.com
) , Il che non va bene quando si tratta degli input dell'utente .
Ecco come lo faccio:
public static bool ValidHttpURL(string s, out Uri resultURI)
{
if (!Regex.IsMatch(s, @"^https?:\/\/", RegexOptions.IgnoreCase))
s = "http://" + s;
if (Uri.TryCreate(s, UriKind.Absolute, out resultURI))
return (resultURI.Scheme == Uri.UriSchemeHttp ||
resultURI.Scheme == Uri.UriSchemeHttps);
return false;
}
Uso:
string[] inputs = new[] {
"https://www.google.com",
"http://www.google.com",
"www.google.com",
"google.com",
"javascript:alert('Hack me!')"
};
foreach (string s in inputs)
{
Uri uriResult;
bool result = ValidHttpURL(s, out uriResult);
Console.WriteLine(result + "\t" + uriResult?.AbsoluteUri);
}
Produzione:
True https://www.google.com/
True http://www.google.com/
True http://www.google.com/
True http://google.com/
False
http://mooooooooo
, in effetti, è un Uri valido. Pertanto, non è possibile verificare Uri.IsWellFormedUriString
dopo aver inserito "http: //" e se lo si verifica prima, tutto ciò che non ha un Scheme
verrà rifiutato. Forse quello che si può fare è controllare s.Contains('.')
invece.
IsWellFormedUriString
prima di aggiungere http://
, finirai per rifiutare cose del genere google.com
e se lo usi dopo aver aggiunto il http://
, tornerà comunque vero per http://mooooooooo
. Ecco perché ho suggerito di verificare se la stringa contiene .
invece un .
Dopo Uri.TryCreate
puoi controllare Uri.Scheme
per vedere se è HTTP (s).
Prova questo:
bool IsValidURL(string URL)
{
string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
return Rgx.IsMatch(URL);
}
Accetterà URL in questo modo:
Ciò restituirebbe bool:
Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)