Überprüfung einer URL auf Korrektheit

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Überprüfung einer URL auf Korrektheit

    Hallo!

    Ich habe aus dem Internet folgenden Code. Dieser zeigt, wie sich eine korrekte, gültige URL zusammensetzt. Für ein Formular versuche ich jetzt, diesen Code in eine PHP-Funktion zu schreiben. Kennt jemand dafür eine einfache Möglichkeit, ohne das alles aufdröseln zu müssen und in endlose Schleifen zu verpacken?

    Danke für alle Tipps und Hinweise!

    thowi

    Code:
    httpurl        = "http://" hostport [ "/" hpath [ "?" search ]]
    alpha          = lowalpha | hialpha
    alphadigit     = alpha | digit
    digit          = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" |
                     "8" | "9"
    digits         = 1*digit
    domainlabel    = alphadigit | alphadigit *[ alphadigit | "-" ] alphadigit
    escape         = "%" hex hex
    extra          = "!" | "*" | "'" | "(" | ")" | ","
    hex            = digit | "A" | "B" | "C" | "D" | "E" | "F" |
                     "a" | "b" | "c" | "d" | "e" | "f"
    hialpha        = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" |
                     "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" |
                     "S" | "T" | "U" | "V" | "W" | "X" | "Y" | "Z"
    host           = hostname | hostnumber
    hostname       = *[ domainlabel "." ] toplabel
    hostnumber     = digits "." digits "." digits "." digits 
    hostport       = host [ ":" port ]
    hpath          = hsegment *[ "/" hsegment ]
    hsegment       = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    lowalpha       = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" |
                     "i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" |
                     "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x" |
                     "y" | "z"
    port           = digits
    safe           = "$" | "-" | "_" | "." | "+"
    search         = *[ uchar | ";" | ":" | "@" | "&" | "=" ]
    toplabel       = alpha | alpha *[ alphadigit | "-" ] alphadigit
    uchar          = unreserved | escape
    unreserved     = alpha | digit | safe | extra

  • #2
    Was denn für Schleifen?
    PHP-Code:
    <?php
    $extra         
    "(!|\*|'|\(|\)|,)";
    $safe          "(\$|\-|_|\.|\+)";
    $digit         "[0-9]";
    $digits        "($digit)*";
    $hex           "($digit|[A-Fa-f])";
    $escape        "(%$hex$hex)";
    $lowalpha      "[a-z]";
    $hialpha       "[A-Z]";
    $alpha         "($lowalpha|$hialpha)";
    $alphadigit    "($alpha|$digit)";
    $unreserved    "($alpha|$digit|$safe|$extra)";
    $uchar         "($unreserved|$escape)";
    $toplabel      "($alpha|($alpha($alphadigit|\-)*$alphadigit))";
    $search        "(($uchar|;|:|@|&|=)*)";
    $hsegment      $search;
    $hpath         "($hsegment(\/$hsegment)*)";
    $port          $digits;
    $hostport      "($host(:$port)?)";
    $hostnumber    "($digits\.$digits\.$digits\.$digits)";
    $domainlabel   "($alphadigit|(($alphadigit|\-)*$alphadigit))";
    $hostname      "(($domainlabel\.)*$toplabel)";
    $host          "($hostname|$hostnumber)";
    $httpurl       "http:\/\/$hostport(\/$hpath(\?$search)?)?";

    echo 
    "/$httpurl/";
    ?>
    Debuggen mußt du es selbst. Korrekt ist der Ausdruck auf keinen Fall, zum Beispiel akzeptiert er 1234.1234.1234.123456... als IP (hostnumber). IPv6 würde er dagegen ablehnen.

    Kommentar


    • #3
      Wenns um das zerlegen einer URL geht, geht auch das hier:

      http://de2.php.net/manual/de/function.parse-url.php

      Um zu prüfen ob eine URL valide ist, empfehle ich sie mit parse_url auseinander zu nehmen und zu schauen ob der Host einen DNS Eintrag hat - im Zeifelsfall noch kurz anfragen ob er existiert.

      Wenn es dir darum geht, ob die URLs die Leute irgendwo eintippen valide sind prüf den übergeben Stringt einfach mit nem regulären Ausdruck der eindeutig einfach sein kann als dieses Codemonster das du gepostet hast.

      EDIT:
      @onemorenerd: \w und \d sind auch toll - achso und modifier "i"
      Zuletzt geändert von prego; 18.05.2006, 17:38.

      Kommentar


      • #4
        Das ist ja super! Mit so einer schnellen und umfangreichen Antwort habe ich ja nicht gerechnet.

        Da in das Formular sowieso ausschließlich Domains und keine IP-Adressen sollen, könnte man das ja dan rauslassen. Nur wie komme ich jetzt noch einen Schritt weiter, dass ich eine Funktion habe und als Ausgabe oder Rückgabewert zum Beispiel ein OK oder ein Nicht OK bekomme?

        PHP-Code:
         function checkdomain($myurl) {
             if (
        $myurl == *gültige Domain*) echo "OK";
             else echo 
        "nicht OK";

        So würde das halt ohne diese falsche IP-Sache aussehen (vielleicht würde auch noch der Port und damit die digits rausfallen):

        PHP-Code:
        <?php
        $extra         
        "(!|*|'|(|)|,)";
        $safe          "(\$|-|_|.|+)";
        $digit         "[0-9]";
        $digits        "($digit)*";
        $hex           "($digit|[A-Fa-f])";
        $escape        "(%$hex$hex)";
        $lowalpha      "[a-z]";
        $hialpha       "[A-Z]";
        $alpha         "($lowalpha|$hialpha)";
        $alphadigit    "($alpha|$digit)";
        $unreserved    "($alpha|$digit|$safe|$extra)";
        $uchar         "($unreserved|$escape)";
        $toplabel      "($alpha|($alpha($alphadigit|-)*$alphadigit))";
        $search        "(($uchar|;|:|@|&|=)*)";
        $hsegment      $search;
        $hpath         "($hsegment(/$hsegment)*)";
        $port          $digits;
        $hostport      "($host(:$port)?)";
        $domainlabel   "($alphadigit|(($alphadigit|-)*$alphadigit))";
        $hostname      "(($domainlabel.)*$toplabel)";
        $host          $hostname;
        $httpurl       "http://$hostport(/$hpath(?$search)?)?";

        echo 
        "/$httpurl/";
        ?>
        Ich habe das übrigens von folgender Seite:

        http://www.ietf.org/rfc/rfc1738.txt

        Deshalb wundert mich dieser Fehler schon irgendwie.

        Viele Grüße
        thowi

        Kommentar


        • #5
          Naja an IPv6 war sicher noch nicht zu denken, als das RFC geschrieben wurde. Und vielleicht steht bzgl. der IPs auch irgendwo, dass nur die ersten drei Digits jedes Blocks benutzt werden. So oder so ist es ein ziemlicher Schnitzer ... aber bei RFCs nichts ungewöhnliches.

          PHP-Code:
          if (preg_match("/$httpurl/"$myurl)) {
              echo 
          'korrekt';
          } else {
              echo 
          'einige Browser verstehen vielleicht was gemeint ist';

          @prego: Ich hab einfach übersetzt, was er da hingeworfen hat.
          Zuletzt geändert von onemorenerd; 18.05.2006, 21:17.

          Kommentar


          • #6
            OffTopic:
            @nerd: weiß ich doch - war doch kein Vorwurf

            Kommentar


            • #7
              danke

              Danke Euch beiden! Ich habe das erstmal wie vorgeschlagen umgesetzt und werde mir diese längere englische Anleitung mal zu Gemüte führen.

              Super! Danke!
              thowi

              Kommentar

              Lädt...
              X