Feedback

Überprüfen ob String eine URL ist

Sprache: C#

Im Internet bin ich neben Regex auf keine weitere Lösung gekommen. Gerade wenn es schnell gegen soll, darf es nicht kompliziert sein. Daher überprüft das Snippet einfach ob URI.Host NULL ist. Tritt bei überprüfen der URI ein Fehler auf gibt er ebenfalls FALSE aus. Viel Spaß damit :-)
// Bool
 private bool IsUrl(string url) {
            try
            {
                Uri adresse = new Uri(url);
                if (adresse.Host != null)
                {

                    return true;

                }
                else
                {
                    return false;

                }
            }
            catch {

                return false;
            
            }
        
        }

// Anwendung:

string EchteUrl = "http://www.networkfreaks.de";
string NurText = "Das war ein netter Versuch";

if(IsUrl(EchteUrl))MessageBox.Show("Echte URL ist ECHT");
if(!IsUrl(NurText))MessageBox.Show("NurText ist keine URL!");


///Nutzung frei nach belieben ;-)
// Bool
 private bool IsUrl(string url) {
            try
            {
                Uri adresse = new Uri(url);
                if (adresse.Host != null)
                {

                    return true;

                }
                else
                {
                    return false;

                }
            }
            catch {

                return false;
            
            }
        
        }

// Anwendung:

string EchteUrl = "http://www.networkfreaks.de";
string NurText = "Das war ein netter Versuch";

if(IsUrl(EchteUrl))MessageBox.Show("Echte URL ist ECHT");
if(!IsUrl(NurText))MessageBox.Show("NurText ist keine URL!");


///Nutzung frei nach belieben ;-)

10 Kommentare

  1. Die Funktion kannst du auch noch kürzer halten.
    [code]
    private bool IsUrl(string url) {
    try
    {
    Uri adresse = new Uri(url);
    return adresse.Host != null;
    }
    catch {

    return false;

    }

    }
    [/code]

  2. Tut mir leid, aber das ist ganz schlechter Programmierstil.
    1. wenn new Uri(url) keine Exception wirft, ist adresse.Host nie null
    2. Eine Exception zu missbrauchen, weil mann anders nicht an die Antwort kommt ist keine Lösung. Eine Exception ist (wie der Name schon sagt) eine Ausnahme. Ein guter Entwickler sollte Exceptions vermeiden, nicht absichtlich auslösen (Wir bauen noch genügend Fehler ungewollt ein 😉 ).
    Übrigens, eine Exception ist auch aus Performance-Sicht eine schlechte Wahl.
    3.Wenn du schon eine Exception fängst, solltest du nicht generell alle Exceptions fangen, sondern hier nur die UriFormatException. Denn wenn beispielsweise bei einer gültigen URL eine OutOfMemory Exception geworfen würde, würdest du daraus den Schluss ziehen, dass diese URL ungültig ist.

    Da ist ein regex doch die bessere Wahl.

  3. Um es ohne Exception zu lösen, gibt es doch die statische TryCreate-Methode, die zurückgibt ob das erstellen möglich war.

  4. Also ich hab das immer so Überprüft:
    ///

    /// [ Funktion ] Url Check V1
    ///

    /// ///
    private bool UrLCheck(string Str_Url)
    {
    //####################################################
    // Locale Variabel
    bool Str_Rueckmeldung;
    //####################################################
    try
    {
    if ((Str_Url.Substring(0, 4) == „www.“) || (Str_Url.Substring(0, 7) == „http://“)) { Str_Rueckmeldung = true; }
    else { Str_Rueckmeldung = false; }
    }
    catch { Str_Rueckmeldung = false; }
    return Str_Rueckmeldung;
    }

  5. Da Snippet von O.G. ist auch nicht besser, nur weil ein String mit http:// oder www. anfängt ist es noch lang keine gültige URL. Was ist z.B. mit SSL (https://… ) ?

    Zum Programmierstil wurde schon einiges geschrieben, viel wichtiger ist aber das URL != URI ist. URL: http://de.wikipedia.org/wiki/Uniform_Resource_Identifier

    Gültige URIs:
    http://dotnet-snippets.de
    ftp://ftp.heise.de/
    mailto:test@test.de
    file:///home/test/test
    tel:+49-089-123456
    bloedsinn:mit_doppelpunkt

    BTW: .host ist nicht null sondern nur ein leerer String wenn kein Host vorhanden ist.

    Werden alle von Snippet als gültige URLs erkannt.

    Der einzig korrekte Web URLs zu erkennen ist sich klarzumachen was als korrekte URL erkannt werden soll und dann Regex zu verwenden.

  6. [code]private bool IsUrl(string url)
    {
    return Uri.IsWellFormedUriString(url, UriKind.Absolute);
    }[/code]

    Oder etwa nicht, ist doc hviel einfacher ?!

  7. @RundR:

    Nein, das funktioniert nicht, deine Funktion liefert die gleichen Ergebnisse die ich oben beschrieben habe.

    Die Frage würde sich auch bei einem Blick in die MSDN erübrigen:

    Uri.IsWellFormedUriString-Methode
    „Gibt an, ob eine Zeichenfolge wohlgeformt ist, indem versucht wird, einen URI aus der Zeichenfolge zu erstellen. Es wird sichergestellt, dass keine weiteren Escapezeichen in die Zeichenfolge eingefügt werden müssen.“
    http://msdn.microsoft.com/de-de/library/system.uri.iswellformeduristring.aspx

    Nochmal: Hier wird dir URI-Klasse benutzt, eine URI ist aber NICHT automatisch eine URL!
    Eine URL ist aber immer eine URI!

  8. Klar das ist mir schon bewusst, aber es ist sauberer als der Vorgabecode.

    Denke da muss man mit RegularExpressions ran damit man ne saubere prüfung hat.