Überprüfen, ob String eine gültige Internetadresse ist

    • VB.NET

    Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

      Überprüfen, ob String eine gültige Internetadresse ist

      Hallo zusammen,
      für mein Programm QuExeCute habe ich mir eine kleine Klasse geschrieben, die erkennt, ob ein gegebener String eine Internetadresse ist oder nicht. Auch Strings wie "google.de" werden als URLs erkennt, was für mich sehr wichtig war. Wenn Ihr noch Fragen oder Verbesserungsvorschläge zu dem Code habt, lasst es mich wissen :)

      Spoiler anzeigen

      VB.NET-Quellcode

      1. Class URL
      2. Dim MostUsedDomainList As New List(Of String)
      3. Dim UnsponsoredDomainList As New List(Of String)
      4. Dim SponsoredDomainList As New List(Of String)
      5. Dim StateDomainList As New List(Of String)
      6. Public Sub New()
      7. ' Meistgenutzte Domains
      8. MostUsedDomainList.AddRange({".com", ".de", ".net", ".uk", ".org", ".info", ".nl", ".eu", ".cn", ".biz"})
      9. ' Nichtgesponsorte Domains
      10. UnsponsoredDomainList.AddRange({".arpa", ".biz", ".com", ".info", ".name", ".net", ".org", ".pro"})
      11. ' Gesponsorte Domains
      12. SponsoredDomainList.AddRange({".aero", ".asia", ".cat", ".coop", ".edu", ".gov", ".int", ".jobs", ".mil", ".mobi", ".museum", ".post", ".tel", ".travel", ".xxx"})
      13. ' Länderspezfische Domains
      14. StateDomainList.AddRange({".ac", ".ad", ".ae", ".af", ".ag", ".ai", ".al", ".am", ".an", ".ao", ".aq", ".ar", ".as", ".at", ".au", ".aw", ".ax", ".az", _
      15. ".ba", ".bb", ".bd", ".be", ".bf", ".bg", ".bh", ".bi", ".bj", ".bl", ".bm", ".bn", ".bo", ".br", ".bq", ".bs", ".bt", ".bv", ".bw", ".by", ".bz", _
      16. ".ca", ".cc", ".cd", ".cf", ".cg", ".ch", ".ci", ".ck", ".cl", ".cm", ".cn", ".co", ".cr", ".cu", ".cv", ".cw", ".cx", ".cy", ".cz", ".cz", _
      17. ".de", ".dj", ".dk", ".dm", ".do", ".dz", _
      18. ".ec", ".ee", ".eg", ".eh", ".er", ".es", ".et", ".eu", _
      19. ".fi", ".fj", ".fk", ".fm", ".fo", ".fr", _
      20. ".ga", ".gb", ".gd", ".ge", ".gf", ".gg", ".gh", ".gi", ".gl", ".gm", ".gn", ".gp", ".gq", ".gr", ".gs", ".gt", ".gu", ".gw", ".gy", _
      21. ".hk", ".hm", ".hn", ".hr", ".ht", ".hu", _
      22. ".id", ".ie", ".il", ".im", ".in", ".io", ".iq", ".ir", ".is", ".it", _
      23. ".je", ".jm", ".jo", ".jp", _
      24. ".ke", ".kg", ".kh", ".ki", ".km", ".kn", ".kp", ".kr", ".kw", ".ky", ".kz", _
      25. ".la", ".lb", ".lc", ".li", ".lk", ".lr", ".ls", ".lt", ".lu", ".lv", ".ly", _
      26. ".ma", ".mc", ".md", ".me", ".mf", ".mg", ".mh", ".mk", ".ml", ".mm", ".mn", ".mo", ".mp", ".mq", ".mr", ".ms", ".mt", ".mu", ".mv", ".mw", ".mx", ".my", ".mz", _
      27. ".na", ".nc", ".ne", ".nf", ".ng", ".ni", ".nl", ".no", ".np", ".nr", ".nu", ".nz", _
      28. ".om", _
      29. ".pa", ".pe", ".pf", ".pg", ".ph", ".pk", ".pl", ".pm", ".pn", ".pr", ".ps", ".pt", ".pw", ".py", _
      30. ".qa", _
      31. ".re", ".ro", ".rs", ".ru", ".rw", _
      32. ".sa", ".sb", ".sc", ".sd", ".se", ".sg", ".sh", ".si", ".sj", ".sk", ".sl", ".sm", ".sn", ".so", ".sr", ".ss", ".st", ".su", ".sv", ".sx", ".sy", ".sz", _
      33. ".tc", ".td", ".tf", ".tg", ".th", ".tj", ".tk", ".tl", ".tm", ".tn", ".to", ".tp", ".tr", ".tt", ".tv", ".tw", ".tz", ".ua", ".ug", ".um", ".us", ".uy", ".uz", _
      34. ".va", ".vc", ".ve", ".vg", ".vi", ".vn", ".vu", _
      35. ".wf", ".ws", _
      36. ".ye", ".yt", _
      37. ".za", ".zm", ".zw"})
      38. End Sub
      39. Public Function IsURL(ByVal Text As String, Optional ByVal Level As Integer = 0) As Boolean
      40. Dim start As Boolean = Text.StartsWith("http://") Or Text.StartsWith("https://")
      41. Dim simple As Boolean = False
      42. Dim unsponsored As Boolean = False
      43. Dim sponsored As Boolean = False
      44. Dim state As Boolean = False
      45. If Level <= 3 And Level >= 0 Then
      46. simple = TestList(MostUsedDomainList, Text)
      47. Else
      48. Throw New ArgumentException("Level must be between 0 and 4")
      49. End If
      50. If Level > 0 Then
      51. unsponsored = TestList(UnsponsoredDomainList, Text)
      52. End If
      53. If Level > 1 Then
      54. sponsored = TestList(SponsoredDomainList, Text)
      55. End If
      56. If Level > 2 Then
      57. state = TestList(StateDomainList, Text)
      58. End If
      59. If (start Or simple Or unsponsored Or sponsored Or state) And Not Text.Contains(" ") Then
      60. Return True
      61. Else
      62. Return False
      63. End If
      64. End Function
      65. Private Function TestList(ByVal List As List(Of String), ByVal Text As String) As Boolean
      66. Dim result As Boolean = False
      67. For Each item As String In List
      68. If Text.Contains(item) Then
      69. result = True
      70. Exit For
      71. End If
      72. Next
      73. Return result
      74. End Function
      75. End Class

      Viele Grüße
      leolabs
      Typischer Anwendungsfall für eine Enumeration.

      VB.NET-Quellcode

      1. public enum DomainTyp As Integer
      2. Unsponsored = 0
      3. Sponsored
      4. State
      Nun kannst du level als DomainTyp deklarieren

      VB.NET-Quellcode

      1. Public Function IsURL(ByVal Text As String, Optional ByVal Level As DomainTyp = Unsponsored) As Boolean
      Im weiteren Code und in Intellisense hast du nun aussagefähige Namen statt der doofen Zahlen.
      Auch ist dadurch ausgeschlossen, dass ein ungültiger Level angegeben werden kann.

      Derzeit ist zB level 3 eiglich ungültig, wird aber ohne Exception verarbeitet, als seis level 2

      C-Quellcode

      1. public static class RegularExpressions {
      2. private static string LATIN_ACCENTS_CHARS;
      3. private static string URL_VALID_PRECEEDING_CHARS;
      4. private static string URL_VALID_CHARS;
      5. private static string URL_VALID_SUBDOMAIN;
      6. private static string URL_VALID_DOMAIN_NAME;
      7. private static string URL_VALID_UNICODE_CHARS;
      8. private static string URL_VALID_GTLD;
      9. private static string URL_VALID_CCTLD;
      10. private static string URL_PUNYCODE;
      11. private static string URL_VALID_DOMAIN;
      12. private static string URL_VALID_PORT_NUMBER;
      13. private static string URL_VALID_GENERAL_PATH_CHARS;
      14. private static string URL_BALANCED_PARENS;
      15. private static string URL_VALID_PATH_ENDING_CHARS;
      16. private static string URL_VALID_PATH;
      17. private static string URL_VALID_URL_QUERY_CHARS;
      18. private static string URL_VALID_URL_QUERY_ENDING_CHARS;
      19. private static string VALID_URL_PATTERN_STRING;
      20. public static Regex VALID_URL;
      21. public static int VALID_URL_GROUP_ALL;
      22. public static int VALID_URL_GROUP_BEFORE;
      23. public static int VALID_URL_GROUP_URL;
      24. public static int VALID_URL_GROUP_PROTOCOL;
      25. public static int VALID_URL_GROUP_DOMAIN;
      26. public static int VALID_URL_GROUP_PORT;
      27. public static int VALID_URL_GROUP_PATH;
      28. public static int VALID_URL_GROUP_QUERY_STRING;
      29. static RegularExpressions() {
      30. LATIN_ACCENTS_CHARS = "\\u00c0-\\u00d6\\u00d8-\\u00f6\\u00f8-\\u00ff\\u0100-\\u024f\\u0253\\u0254\\u0256\\u0257\\u0259\\u025b\\u0263\\u0268\\u026f\\u0272\\u0289\\u028b\\u02bb\\u0300-\\u036f\\u1e00-\\u1eff";
      31. URL_VALID_PRECEEDING_CHARS = "(?:[^\\-/\"'!=A-Z0-9_@@$##.\\u202A-\\u202E]|^)";
      32. URL_VALID_CHARS = string.Concat("\\p{L}\\p{N}", LATIN_ACCENTS_CHARS);
      33. string[] uRLVALIDCHARS = new string[7];
      34. uRLVALIDCHARS[0] = "(?:(?:[";
      35. uRLVALIDCHARS[1] = URL_VALID_CHARS;
      36. uRLVALIDCHARS[2] = "][";
      37. uRLVALIDCHARS[3] = URL_VALID_CHARS;
      38. uRLVALIDCHARS[4] = "\\-_]*)?[";
      39. uRLVALIDCHARS[5] = URL_VALID_CHARS;
      40. uRLVALIDCHARS[6] = "]\\.)";
      41. URL_VALID_SUBDOMAIN = string.Concat(uRLVALIDCHARS);
      42. uRLVALIDCHARS = new string[7];
      43. uRLVALIDCHARS[0] = "(?:(?:[";
      44. uRLVALIDCHARS[1] = URL_VALID_CHARS;
      45. uRLVALIDCHARS[2] = "][";
      46. uRLVALIDCHARS[3] = URL_VALID_CHARS;
      47. uRLVALIDCHARS[4] = "\\-]*)?[";
      48. uRLVALIDCHARS[5] = URL_VALID_CHARS;
      49. uRLVALIDCHARS[6] = "]\\.)";
      50. URL_VALID_DOMAIN_NAME = string.Concat(uRLVALIDCHARS);
      51. URL_VALID_UNICODE_CHARS = "[.[^\\p{P}\\p{S}\\s\\p{Z}\\p{IsGeneralPunctuation}]]";
      52. URL_VALID_GTLD = "(?:(?:aero|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|xxx)(?=\\P{L}|$))";
      53. URL_VALID_CCTLD = "(?:(?:ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|ss|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|za|zm|zw)(?=\\P{L}|$))";
      54. URL_PUNYCODE = "(?:xn--[0-9a-z]+)";
      55. uRLVALIDCHARS = new string[29];
      56. uRLVALIDCHARS[0] = "(?:";
      57. uRLVALIDCHARS[1] = URL_VALID_SUBDOMAIN;
      58. uRLVALIDCHARS[2] = "+";
      59. uRLVALIDCHARS[3] = URL_VALID_DOMAIN_NAME;
      60. uRLVALIDCHARS[4] = "(?:";
      61. uRLVALIDCHARS[5] = URL_VALID_GTLD;
      62. uRLVALIDCHARS[6] = "|";
      63. uRLVALIDCHARS[7] = URL_VALID_CCTLD;
      64. uRLVALIDCHARS[8] = "|";
      65. uRLVALIDCHARS[9] = URL_PUNYCODE;
      66. uRLVALIDCHARS[10] = "))|(?:";
      67. uRLVALIDCHARS[11] = URL_VALID_DOMAIN_NAME;
      68. uRLVALIDCHARS[12] = "(?:";
      69. uRLVALIDCHARS[13] = URL_VALID_GTLD;
      70. uRLVALIDCHARS[14] = "|";
      71. uRLVALIDCHARS[15] = URL_PUNYCODE;
      72. uRLVALIDCHARS[16] = "))|(?:(?<=https?://)(?:(?:";
      73. uRLVALIDCHARS[17] = URL_VALID_DOMAIN_NAME;
      74. uRLVALIDCHARS[18] = URL_VALID_CCTLD;
      75. uRLVALIDCHARS[19] = ")|(?:";
      76. uRLVALIDCHARS[20] = URL_VALID_UNICODE_CHARS;
      77. uRLVALIDCHARS[21] = "+\\.(?:";
      78. uRLVALIDCHARS[22] = URL_VALID_GTLD;
      79. uRLVALIDCHARS[23] = "|";
      80. uRLVALIDCHARS[24] = URL_VALID_CCTLD;
      81. uRLVALIDCHARS[25] = "))))|(?:";
      82. uRLVALIDCHARS[26] = URL_VALID_DOMAIN_NAME;
      83. uRLVALIDCHARS[27] = URL_VALID_CCTLD;
      84. uRLVALIDCHARS[28] = "(?=/))";
      85. URL_VALID_DOMAIN = string.Concat(uRLVALIDCHARS);
      86. URL_VALID_PORT_NUMBER = "[0-9]+";
      87. URL_VALID_GENERAL_PATH_CHARS = string.Concat("[a-z0-9!\\*';:=\\+,.\\$/%#\\[\\]\\-_~\\|&", LATIN_ACCENTS_CHARS, "]");
      88. URL_BALANCED_PARENS = string.Concat("\\(", URL_VALID_GENERAL_PATH_CHARS, "+\\)");
      89. uRLVALIDCHARS = new string[5];
      90. uRLVALIDCHARS[0] = "[a-z0-9=_#/\\-\\+";
      91. uRLVALIDCHARS[1] = LATIN_ACCENTS_CHARS;
      92. uRLVALIDCHARS[2] = "]|(?:";
      93. uRLVALIDCHARS[3] = URL_BALANCED_PARENS;
      94. uRLVALIDCHARS[4] = ")";
      95. URL_VALID_PATH_ENDING_CHARS = string.Concat(uRLVALIDCHARS);
      96. uRLVALIDCHARS = new string[10];
      97. uRLVALIDCHARS[0] = "(?:(?:";
      98. uRLVALIDCHARS[1] = URL_VALID_GENERAL_PATH_CHARS;
      99. uRLVALIDCHARS[2] = "*(?:";
      100. uRLVALIDCHARS[3] = URL_BALANCED_PARENS;
      101. uRLVALIDCHARS[4] = URL_VALID_GENERAL_PATH_CHARS;
      102. uRLVALIDCHARS[5] = "*)*";
      103. uRLVALIDCHARS[6] = URL_VALID_PATH_ENDING_CHARS;
      104. uRLVALIDCHARS[7] = ")|(?:@";
      105. uRLVALIDCHARS[8] = URL_VALID_GENERAL_PATH_CHARS;
      106. uRLVALIDCHARS[9] = "+/))";
      107. URL_VALID_PATH = string.Concat(uRLVALIDCHARS);
      108. URL_VALID_URL_QUERY_CHARS = "[a-z0-9!?\\*'\\(\\);:&=\\+\\$/%#\\[\\]\\-_\\.,~\\|]";
      109. URL_VALID_URL_QUERY_ENDING_CHARS = "[a-z0-9_&=#/]";
      110. uRLVALIDCHARS = new string[13];
      111. uRLVALIDCHARS[0] = "((";
      112. uRLVALIDCHARS[1] = URL_VALID_PRECEEDING_CHARS;
      113. uRLVALIDCHARS[2] = ")((https?://)?(";
      114. uRLVALIDCHARS[3] = URL_VALID_DOMAIN;
      115. uRLVALIDCHARS[4] = ")(?::(";
      116. uRLVALIDCHARS[5] = URL_VALID_PORT_NUMBER;
      117. uRLVALIDCHARS[6] = "))?(/";
      118. uRLVALIDCHARS[7] = URL_VALID_PATH;
      119. uRLVALIDCHARS[8] = "*)?(\\?";
      120. uRLVALIDCHARS[9] = URL_VALID_URL_QUERY_CHARS;
      121. uRLVALIDCHARS[10] = "*";
      122. uRLVALIDCHARS[11] = URL_VALID_URL_QUERY_ENDING_CHARS;
      123. uRLVALIDCHARS[12] = ")?))";
      124. VALID_URL_PATTERN_STRING = string.Concat(uRLVALIDCHARS);
      125. VALID_URL = new Regex(VALID_URL_PATTERN_STRING, RegexOptions.IgnoreCase);
      126. VALID_URL_GROUP_ALL = 1;
      127. VALID_URL_GROUP_BEFORE = 2;
      128. VALID_URL_GROUP_URL = 3;
      129. VALID_URL_GROUP_PROTOCOL = 4;
      130. VALID_URL_GROUP_DOMAIN = 5;
      131. VALID_URL_GROUP_PORT = 6;
      132. VALID_URL_GROUP_PATH = 7;
      133. VALID_URL_GROUP_QUERY_STRING = 8;
      134. }
      135. public static bool IsUrl(string Text) {
      136. return VALID_URL.Match(Text).Success;
      137. }
      138. }
      Ausschnitt aus LittleTweet, mit Extension-Method unten dran. Entweder kannst dus nach VB.NET porten oder es in C# kompilieren und die Extension-Method nutzen.
      auch hier wäre eine Enumeration Programm-Element der Wahl: Alle deine VALID_URL_GROUP-Felder ließen sich zusammenfassen als:

      C-Quellcode

      1. public enum Valid_Url_Group { ALL=1, BEFORE, URL, PROTOCOL, DOMAIN, PORT, PATH, QUERY_STRING }

      Auch das mittm uRLVALIDCHARS-Array ist unnötig aufwändig, unleserlich, unsicher

      C-Quellcode

      1. //vergleiche:
      2. string[] uRLVALIDCHARS = new string[7];
      3. uRLVALIDCHARS[0] = "(?:(?:[";
      4. uRLVALIDCHARS[1] = URL_VALID_CHARS;
      5. uRLVALIDCHARS[2] = "][";
      6. uRLVALIDCHARS[3] = URL_VALID_CHARS;
      7. uRLVALIDCHARS[4] = "\\-_]*)?[";
      8. uRLVALIDCHARS[5] = URL_VALID_CHARS;
      9. uRLVALIDCHARS[6] = "]\\.)";
      10. URL_VALID_SUBDOMAIN = string.Concat(uRLVALIDCHARS);
      11. //mit:
      12. URL_VALID_SUBDOMAIN = string.Concat("(?:(?:[", URL_VALID_CHARS, "][", URL_VALID_CHARS, "\\-_]*)?[", URL_VALID_CHARS, "]\\,)");
      13. //oder gar mit:
      14. URL_VALID_SUBDOMAIN = string.Join(URL_VALID_CHARS, "(?:(?:[", "][", "\\-_]*)?[", "]\\,)");

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

      naja, ich dachte, es könnte dich interessieren, wie man die Umständlichkeit der zeilen #2 - #10 auch als Einzeiler (#12) formulieren kann.
      Auf die ganze Methode angewandt würde das den Code erheblich schnuckliger machen.
      Der Sicherheitsvorteil am ParamArray des Einzeilers ist, dass der Compiler die Anzahl der Array-Elemente selbst erkennt - du dich also nicht drum kümmern mußt, bei zufügen oder wegnehmen von Elementen die Array-Dimensionierung zu ändern.
      So als Tipp für eleganten und leichten Code-Stil für wen das interessiert - mit Nano-Sekunden hat das nix zu tun.

      Und die Klasse muß auch nicht geändert werden - die scheint ja praxiserprobt, und wird keinerlei Veränderungen mehr ausgesetzt sein - die ist gewissermaßen nur Beispiel für den Tipp - mehr nicht.

      Desgleichen der Hinweis auf Einsatz von Enums: Der Code sieht halt aus, als sei dir nicht bekannt, wie du das VB/c#-Sprachelement "Enum" für dich arbeiten lassen kannst.
      Zu wissen, wie das geht, könnte aber auch in vielen anneren Problemstellungen von Nutzen sein.

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()