Laden...

Prüfen, ob ein String eine Url (für eine Webseite) ist

Erstellt von Fummelchen vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.799 Views
F
Fummelchen Themenstarter:in
2 Beiträge seit 2012
vor 12 Jahren
Prüfen, ob ein String eine Url (für eine Webseite) ist

Ich möchte gerne nach dem Click-Event überprüfen ob in der Textbox die Kriterien einer Webaddresse enthalten sind.

http://www.google.com

wie stelle ich das am besten an?

M
402 Beiträge seit 2005
vor 12 Jahren

Hi Fummelchen,

sowas geht am besten mit einem regulären Ausdruck.

lg

U
58 Beiträge seit 2011
vor 12 Jahren

du kannst ja auch für eine schnelle lösung die

TextBox1.Text.StartsWith("http://www.") --> bool

und

TextBox1.Text.EndsWith(".com") --> bool

funktionen verwenden.

D
216 Beiträge seit 2009
vor 12 Jahren

Das funktioniert so vorne und hinten nicht...

Was passiert wenn man das http weglässt, oder https hat, statt www eine Subdomain, eine andere TLD als .com, eventuell noch einen Pfad hinten dran? Die StartsWith/EndsWith Variante funktioniert vllt. in 1% aller Fälle.

Darth Maim

F
Fummelchen Themenstarter:in
2 Beiträge seit 2012
vor 12 Jahren

nene, M@TUK hat's schon in die richtige Richtung gebracht. -> Regular Expressions ist hier eindeutig die beste Lösung.

Momentan sieht mein Muster so aus:

Regex RgxUrl = new Regex(@"^(http|https)\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$");

lässt aber noch so einige Fehler zu.

Experimentiere gerade ein wenig mit der Klasse "System.Globalization.CompareInfo" und versuche Fehleingaben so zu filtern und ggf zu berichtigen.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo Fummelchen,

dafür sollte es jede Menge fertiger Pattern geben. Einen guten zu finden, dürfte allerdings nicht einfacher sein, als einen guten zu schreiben. 😃

Um einen guten zu schreiben, muss man natürlich erstmal die Regeln für Domainnamen kennen. Dazu sollte man am besten in die entsprechende RFC schauen. So sind Toplevel-Domains schon lange nicht mehr auf zwei oder drei Stellen begrenzt (z.B. .info, .name) und gerade in Zukunft werden noch viele längere TLDs kommen. Auch sind mittlerweile Umlaute u.ä. erlaubt (z.B. w****ww.äöüÄÖÜ.de). Es ist eh die Frage, wie strikt man prüfen sollte, gerade mit dem Blick, dass in Zukunft vielleicht noch weitere Lockerungen vorgenommen werden.

Ich denke, wenn auf den zu prüfenden String ^https?://[^.]+\..+/ zutrifft, kann man davon ausgehen, dass es sich um eine Url handelt. Ob sie gültig ist, kann man per Regex eh nicht abschließend prüfen, denn selbst wenn das Format stimmt, bedeutet das ja nicht, dass die Domain existiert.

herbivore

PS: Für die Prüfung von E-Mail-Adressen werden in How to Find or Validate an Email Address einige interessante Überlegungen angestellt, die man auch auf URLs übertragen kann.

U
1.688 Beiträge seit 2007
vor 12 Jahren

Hallo,

man kann es sich auch ganz einfach machen und die Fähigkeiten der Uri-Klasse benutzen.

U
58 Beiträge seit 2011
vor 12 Jahren

Was passiert wenn man das http weglässt, oder https hat, statt www eine Subdomain, eine andere TLD als .com, eventuell noch einen Pfad hinten dran? Die StartsWith/EndsWith Variante funktioniert vllt. in 1% aller Fälle.

ja, natürlich reicht der code oben allein noch nicht aus. da sollte man schon noch eine ordentliche fallunterscheidung einbauen. dann kommst du auch wesentlich weiter als "1%" 😉 kommst genauso weit wie mit regular expressions.

ob ich nun den string mit regular expressions oder mit "normalen" string-operationen überprüfe, ist doch vielmehr sache des geschmacks, oder gibt es da signifikante performanceunterschiede?

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo uNki,

es gibt signifikante Unterschiede in der Länge des erforderlichen Quellcodes. Gerade wenn man alle möglichen Varianten mit normalen String-Operationen ausprogrammiert, wird es sehr länglich. In Regex erfordert das dagegen oft nur ein zusätzliches Zeichen, z.B. ? oder * oder |. Insofern ist Regex die deutlich bessere Wahl gegenüber StartsWith & Co.

herbivore

EDIT: Wobei die Länge des Quellcodes natürlich nicht per se etwas über seine Güte sagt. Allerdings ist mit normalen String-Operationen ausprogrammierter Code nicht nur länglich, sondern typischerweise auch sehr unübersichtlich und damit normalerweise schlechter zu lesen und schwerer zu verstehen, als der gleichwertige Regex-Pattern.

U
58 Beiträge seit 2011
vor 12 Jahren

was mich dabei noch interessieren würde: werden regular expressions vom compiler auch schneller "abgearbeitet" als "normale" string-operationen? oder ist es so, dass regular expressions im hintergrund auch nur durch normale string-operationen ausgeführt werden?
(wie z.b. eine foreach-schleife, die im hintergrund ja auch nur wie eine gewöhnliche for-schleife behandelt wird - wenn ich mich nicht irre)

danke

Hinweis von herbivore vor 12 Jahren

Naheliegenderweise arbeitet Regex intern nicht mit Voodoo. Also natürlich letzteres. Anderseits werden dabei teilweise Optimierungen verwenden, auf die der Durchschnittsprogrammierer nicht so leicht kommt. Was schneller ist, hängt immer von der konkreten Situation und dem konkreten Pattern ab. Mögliche Unterschiede in der Ausführungsgeschwindigkeit sind aber auf heutigen Rechnern so gut wie nie relevant.

BTW: foreach wird intern in eine while-Schleife (innerhalb eines try-finally) umgesetzt, siehe C# Language Specification: 8.8.4 The foreach statement, siehe auch foreach oder for? was ist schneller? Ist die Reihenfolge festgelegt?.

Back2Topic

5.742 Beiträge seit 2007
vor 12 Jahren

es sich auch ganz einfach machen und die Fähigkeiten der
>
benutzen.

Ja - aber das wäre wohl zu einfach...

6.862 Beiträge seit 2003
vor 12 Jahren

Kleine Anmerkung: URL und URI sind nicht das gleiche. Nichtsdestotrotz lässt sich natürlich durch Verwendung der URI Klasse prüfen ob die URL gültig ist.

Baka wa shinanakya naoranai.

Mein XING Profil.

C
1.214 Beiträge seit 2006
vor 12 Jahren

Ich würde an der Stelle nicht zu viel Aufwand treiben. Ich kann dir sagen, wie das in subversion gelöst ist (die müssen an zig Stellen entscheiden, ob ein übergebener Pfad eine Url oder ein lokaler Pfad ist). Die prüfen im Endeffekt nur, ob der String mit ein paar Buchstaben + "://" anfängt. Das hat natürlich gewisse Einschränkungen und mag in deinem Fall vielleicht gar nicht reichen, aber etwas ähnliches würde ich auch bauen.

L
667 Beiträge seit 2004
vor 12 Jahren

es gibt signifikante Unterschiede in der Länge des erforderlichen Quellcodes. Gerade wenn man alle möglichen Varianten mit normalen String-Operationen ausprogrammiert, wird es sehr länglich. In Regex erfordert das dagegen oft nur ein zusätzliches Zeichen, z.B. ? oder * oder |. Insofern ist Regex die deutlich bessere Wahl gegenüber StartsWith & Co.

Ein längerer Code ist nicht automatisch ein schlechterer Code, gerade im Hinblick auf die Lesbarkeit. Wenn ich irgendwo RegExp sehe kommt mir das Grausen, das erinnert mich immer an die kryptischen Perl-Scripts aus längst vergangenen Zeiten. Lambda Expressions sind genauso ein Murks, der nicht zur Lesbarkeit beigetragen hat. Ist aber nur meine Meinung...

Hinweis von herbivore vor 12 Jahren

Korrekt, längerer Code ist nicht automatisch schlechter, und es stimmt, dass (komplexere) Regex-Ausdrücke nicht so schön zu lesen sind, aber ein als normaler Code "ausprogrammierer" Regex Ausdruck ist typischerweise deutlich schlechter zu lesen und schwerer zu verstehen, als der Regex-Ausdruck.

Aber bitte nochmal: Back2Topic!

"It is not wise to be wise" - Sun Tzu