Bir dizenin geçerli bir HTTP URL olup olmadığını nasıl kontrol edebilirim?


Yanıtlar:


452

HTTP URL'lerini doğrulamak için bunu deneyin ( uriNametest etmek istediğiniz URI'dır):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && uriResult.Scheme == Uri.UriSchemeHttp;

Veya hem HTTP hem de HTTPS URL'lerini geçerli olarak kabul etmek istiyorsanız (J0e3gan'ın yorumu uyarınca):

Uri uriResult;
bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) 
    && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);

6
UriName.Scheme yerine uriResult.Scheme yazmalı mı? Bu ilk parametre olarak Uri yerine String alır TryCreate için aşırı yük kullanıyorum.

7
UriResult.Scheme == ... Özellikle https'ye daha fazla koşul eklemek isteyebilirsiniz. Bunun için neye ihtiyacınız olduğuna bağlı, ancak bu küçük değişiklik benim için mükemmel bir şekilde çalışması için ihtiyacım olan tek şeydi.
Fiarr

11
@ Fiarr'ın açıklamasına göre, HTTP URL'lerine ek olarak HTTPS'yi hesaba katmak için gereken "küçük değişiklik":bool result = Uri.TryCreate(uriName, UriKind.Absolute, out uriResult) && uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps;
J0e3gan

3
bu şekilde abcde gibi URL'ler için başarısız olur . Bunun geçerli bir URL olduğunu söylüyor.
Kailash P

7
Görünüşe göre bu teknik 75 testin 22'sinde
whitneyland

98

Bu yöntem hem http hem de https'de sorunsuz çalışır. Sadece bir satır :)

if (Uri.IsWellFormedUriString("https://www.google.com", UriKind.Absolute))

MSDN: IsWellFormedUriString


13
Bu (HTTP olmayan URI'ler için yani doğru döndürür başka düzeni gibi file://ya da ldap://bu çözelti Şema karşı bir kontrol ile birlikte olmalıdır - örn.if (uri.Scheme != Uri.UriSchemeHttp && uri.Scheme != Uri.UriSchemeHttps) ...
squiggle

Bu RFC3986 uyumlu mu?
Marcus

3
@Squiggle Tam olarak kontrol etmesini istediğim şey , bir Downloader yaptığımdan beri her şey . Yani, bu cevap benim için en iyi yöntem.
Beyondo

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

Kullanımı:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

GÜNCELLEME: (tek satır kod) Teşekkürler @GoClimbColorado

public static bool CheckURLValid(this string source) => Uri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps;

Kullanımı:

string url = "htts://adasd.xc.";
if(url.CheckUrlValid())
{
  //valid process
}

Bu www URL'lerini işlemiyor gibi görünmüyor. IE: www.google.com geçersiz olarak gösterilir.
Zauber Paracelsus

6
@ZauberParacelsus "www.google.com" geçersiz. URL ortalaması "http", "ftp", "file" vb. İle başlamalıdır. Dize, boşluk olmadan "http: // www.google.com" olmalıdır
Erçin Dedeoğlu

1
Bugün, out parametresi bir iyileştirme yapabilirUri.TryCreate(source, UriKind.Absolute, out Uri uriResult) && uriResult.Scheme == Uri.UriSchemeHttps
GoClimbColorado

11

Buradaki tüm yanıtlar, diğer şemalara sahip URL'lere izin verir (ör. file://, ftp://) Veya başlamamış http://veya okunamayan URL'leri reddeder https://(ör.www.google.com ) kullanıcı girişlerine uğraşırken değil iyidir .

İşte nasıl yaparım:

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;
}

Kullanımı:

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);
}

Çıktı:

True    https://www.google.com/
True    http://www.google.com/
True    http://www.google.com/
True    http://google.com/
False

1
Bu, "mooooooooo" gibi tek kelimelere izin verir ancak Uri.IsWellFormedUriString ile birlikte kullanılabilir
Epirocks

@Epirocks Bu iyi bir nokta. Sorun şu ki http://mooooooooo, aslında, geçerli bir Uri. Bu nedenle, Uri.IsWellFormedUriString"http: //" ekledikten sonra kontrol edemezsiniz ve daha önce kontrol ederseniz, olmayan bir şey Schemereddedilir. Belki s.Contains('.')bunun yerine ne yapılabileceğini kontrol edebiliriz .
Ahmed Abdelhameed

moooooo kendi başına bir url gibi görünmüyor çünkü üzerinde protokol yok. Yaptığım şey regex maç çağrınızı çıkartmaktı ve IsWellFormedUriString ile de bunu yaptık.
Mart'ta

@Epirocks Kesinlikle! Sorun şu ki , IsWellFormedUriStringeklemeden önce kullanırsanız, bunun http://gibi şeyleri reddedersiniz google.comve ekledikten sonra kullanırsanız http://, yine de true değerine dönecektir http://mooooooooo. Bu yüzden dize .yerine bir tane içerip içermediğini kontrol etmeyi önerdim .
Ahmed Abdelhameed

zaten benim için iyi http veya https olmadan bir url kabul etmek istemiyorum. Bu yüzden önce IsWellFormedUriString kullanıyorum, sonra fonksiyonunuzu regex olmadan kullanıyorum. bool bResult = (Uri.IsWellFormedUriString (s, UriKind.Absolute) && ValidHttpURL (s, dışarı uriResult)); Teşekkürler
Epirocks


4

Bunu dene:

bool IsValidURL(string URL)
{
    string Pattern = @"^(?:http(s)?:\/\/)?[\w.-]+(?:\.[\w\.-]+)+[\w\-\._~:/?#[\]@!\$&'\(\)\*\+,;=.]+$";
    Regex Rgx = new Regex(Pattern, RegexOptions.Compiled | RegexOptions.IgnoreCase);
    return Rgx.IsMatch(URL);
}

URL şu şekilde kabul edilecektir:

  • http (s): //www.example.com
  • http (s): //stackoverflow.example.com
  • http (s): //www.example.com/page
  • http (s): //www.example.com/page id = 1 ve ürün = 2
  • http (s): //www.example.com/page#start
  • http (s): //www.example.com: 8080
  • http (s): //127.0.0.1
  • 127.0.0.1
  • www.example.com
  • example.com

2

Bu bool döndürür:

Uri.IsWellFormedUriString(a.GetAttribute("href"), UriKind.Absolute)

2
Bence özellikle belirtilen OP, dosya yolları için doğru verir gibi Uri.IsWellFormedUriString sevmez. Bu soruna bir çözümünüz var mı?
Haziran'ta Isantipov

1
Uri uri = null;
if (!Uri.TryCreate(url, UriKind.Absolute, out uri) || null == uri)
    return false;
else
    return true;

İşte urltest etmeniz gereken dize.


3
null == url kontrolü korkunç bir şekilde reduntant
JSON

0
bool passed = Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)

Cevabınız daha düşük kaliteli yazılarda geldi. Kodunuz açıklayıcı olsa bile lütfen bazı açıklamalar sağlayın.
Harsha Biyani
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.