kostenloser Webspace werbefrei: lima-city


Eingegebene Url überprüfen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    g***b

    Hallo,

    für einen Url-Shorter nutze ich zum prüfen der Url ereg(). Leider funktionert das nicht bei z.b. http://****:de/index.php?bla=1&test=2 sonder nur mit http://******.de

    Wie müsste ich die Regel anpassen, damit das dort geht? Oder gibt es da eine komplett andere möglichkeit die Url zu prüfen, um zu verhindern, dass nur blabla statt einer url eingeben wird?

    Hier der Code:
    if(ereg("^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(/\S*)?$",$_POST['url'])){


    Vielen Dank und viele Grüße
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. optimal ist der code auch nicht, denn zB .info domains erkennt er nicht.
  4. He Leute,
    eigentlich gehört dieses Problem in den Fred http://www.lima-city.de/board/sonstige-programmiersprachen, auch wenn die REGEXP hier unter PHP genutzt wird ...

    Die Regular Expression kann natürlich grundsätzlich nur die syntaktische Korrektheit und nicht die Existenz einer URL abfragen. So etwas geht eben nur über eine echte Abfrage (z.B im Hintergrund über Ajax). Aber auch die hier angegegbene Regexp-Syntax läßt sich noch ein wenig anpassen/verbessern:

    1. Um auch info-Domains zuzulassen, muss einfach die Stringlänge für die TLD angehoben werden von max. 3 auf max. 4 Zeichen, also statt "\.[a-zA-Z]{2,3}" jetzt
    \.[a-zA-Z]{2,4}

    2. Um GET-Argumente hinter der URL zuzulassen könnte der String um folgendes ergänzt werden:
    (\?\S+=\S*(\&\S+=\S+)*)?

    äußere Klammer: es wird dort nach dem Vorhandensein ("?"=einmal oder gar nicht) eines Strings gesucht, der mit einem Fragezeichen beginnt "\?", dann mindestens ein oder mehrere non-blank-Zeichen enthält "\S+", danach genau ein "=", danach beliebig viele (=auch keine) non-blan-Zeichen "\S*" (Variableninhalte können auch leer sein), danach optional (Klammergruppe mit "*" bedeutet 0 bis n mal) weitere Argumente, die mit "&" abgetrennt sind.
    Der Gesamt-Regexp-Ausdruck müsste in etwa so aussehen (habe ich jedoch nicht ausgetestet):
    ^http\://[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4}(/\S*)?(\?\S+=\S*(\&\S+=\S*)*)?$


    Beitrag zuletzt geändert: 15.2.2010 8:59:18 von cars-ten
  5. Alles sehr böse. Eine URL hat hinter dem Slash der Domain frei zu sein. Zudem ist http nicht das einzige Protokoll, https und ftp sind geläufig. Öfters gibt man den Server auch als IP an. Man kann den Port angeben, usw...

    Wenn du den IP-Fall auslässt, mach es so:
    Check ob das Protokoll http, https oder ftp ist. Check, dass es eine Domain gibt. einen Punkt. Eine TLD. Danach optional eine Port-Angabe. Das danach hat dich nicht zu interessieren.

    Also so:
    #^(?:ht|f)tps?://)(?:[-_a-zA-Z0-9-]\.)+[a-zA-Z]{2,4}(?::[0-9]{0,6})?/#

    (Die Anzahl der Stellen beim Port weiß ich nicht, das ist geraten)
    preg_match('#^(?:ht|f)tps?://)((?:[-_a-zA-Z0-9-]\.)+[a-zA-Z]{2,4})(?::[0-9]{0,6})?#', $URL, $matches)

    Anschließend prüfst du, ob die Domain einen A-Record hat:
    checkdnsrr($matches[1], 'A');


    (Regex nicht getestet, kann Fehler enthalten)
  6. t*****b

    Und dann gibt es noch Domains die einen Umlaut enthalten (technisch gesehen nicht, aber den Punycode wird wohl niemand eintippen/einfügen).
  7. Autor dieses Themas

    g***b

    Hallo,

    vielen dank für eure Antworten, ich habe es mit nikic's erklärung gut umsetzen können.

    Viele Grüße
  8. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!