Wypróbuj to, aby sprawdzić poprawność adresów URL HTTP ( uriNamejest to URI, który chcesz przetestować):
Uri uriResult;bool result =Uri.TryCreate(uriName,UriKind.Absolute,out uriResult)&& uriResult.Scheme==Uri.UriSchemeHttp;
Lub jeśli chcesz zaakceptować zarówno adresy URL HTTP, jak i HTTPS jako prawidłowe (na komentarz J0e3gan):
Uri uriResult;bool result =Uri.TryCreate(uriName,UriKind.Absolute,out uriResult)&&(uriResult.Scheme==Uri.UriSchemeHttp|| uriResult.Scheme==Uri.UriSchemeHttps);
Czy powinien to czytać uriResult.Scheme zamiast uriName.Scheme? Używam przeciążenia do TryCreate, które bierze String zamiast Uri jako pierwszego parametru.
7
Możesz dodać więcej warunków do uriResult.Scheme == ... W szczególności https. To zależy od tego, czego potrzebujesz, ale ta mała zmiana była wszystkim, czego potrzebowałem, aby działała idealnie dla mnie.
Aby być jasnym w komentarzu @ Fiarra, „mała zmiana” potrzebna do uwzględnienia HTTPS oprócz adresów URL HTTP to:bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
Zwróci to wartość true dla identyfikatorów URI innych niż HTTP (tj. Każdego innego schematu, takiego jak file://lub ldap://. To rozwiązanie powinno być połączone z kontrolą względem schematu - np.if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
@ZauberParacelsus „www.google.com” jest nieprawidłowy. Średni adres URL powinien zaczynać się od „http”, „ftp”, „plik” itp. Ciąg powinien być „http: // www.google.com” bez spacji
Wszyscy tutaj odpowiedzi zezwolić URL z innymi systemami (np file://, ftp://) lub odrzucić URL czytelny dla człowieka, które nie zaczynają się http://lub https://(na przykład www.google.com), co nie jest dobre, gdy do czynienia z wejściami użytkownika .
Oto jak to robię:
publicstaticboolValidHttpURL(string s,outUri 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);returnfalse;}
Stosowanie:
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);}
@Epirocks To dobra uwaga. Problem polega na tym http://mooooooooo, że w rzeczywistości jest to prawidłowy Uri. Dlatego nie możesz sprawdzić Uri.IsWellFormedUriStringpo wstawieniu „http: //”, a jeśli zaznaczysz to wcześniej, wszystko, co nie ma, Schemezostanie odrzucone. Może to, co można zrobić, to sprawdzamy s.Contains('.')zamiast tego.
moooooo sam w sobie nie wygląda na adres URL, ponieważ nie ma na nim protokołu. To, co zrobiłem, to wybranie twojego dopasowania do wyrażenia regularnego, a także && z IsWellFormedUriString.
@Epirocks Dokładnie! Problem polega na tym, że jeśli użyjesz IsWellFormedUriStringprzed dodaniem http://, ostatecznie odrzucisz takie rzeczy, google.coma jeśli użyjesz go po dodaniu http://, to nadal zwróci wartość true http://mooooooooo. Dlatego zasugerowałem sprawdzenie, czy ciąg zawiera .zamiast niego.
to jest dla mnie w porządku, mimo to nie chcę akceptować adresu URL bez http lub https. Więc najpierw używam IsWellFormedUriString, a następnie używam twojej funkcji bez wyrażenia regularnego. bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, out uriResult)); Dzięki
Myślę, że OP konkretnie wspomniał, że nie lubi Uri.IsWellFormedUriString, ponieważ daje to prawdę dla ścieżek plików. Czy masz rozwiązanie tego problemu?
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.