Chrisi: Regex, URL Check ...

Hallöchen Ihr,

ich habe mir eine Regex gebaut die eine URL mit PHP & preg_match() auf Gültigkeit prüfen soll:

/^(http|https)://(([A-Z0-9][A-Z0-9_-ÄÜÖ]*)(.[A-Z0-9ÄÜÖ][A-Z0-9_-ÄÜÖ]*)+)(:(\d+))?//i

Klappt auch ganz gut, aber :-)

http://www.test.de?test=123

matcht nicht ...

Alles andere geht:

http://www.test.de/index.html?test=123
http://www.test.de/

Habe versucht hinten ein "oder" einzubauen:

...]*)+)(:(\d+))?|//i

Aber dann matcht er auf alles.

Kann da mal jemand auf meine Regex schauen und mir helfen das Problem in den Griff zu bekommen ?

Matchen soll die Regex immer auf:

http://www.test.de/
https://www.test.de/
http://www.test.de/index.php?par=par
https://www.test.de/index.php?par=par

Beim googlen habe ich immer nur Beispiele gefunden die nur die Domain prüfen, ohne den Query, vielleicht hat ja jemand einen guten Link wo ich mich schlau machen kann ?

Danke & Viele Grüße

Chrisi

  1. Hallöchen Chrisi,

    ich habe mir eine Regex gebaut die eine URL mit PHP & preg_match() auf Gültigkeit prüfen soll:

    /^(http|https)://(([A-Z0-9][A-Z0-9_-ÄÜÖ]*)(.[A-Z0-9ÄÜÖ][A-Z0-9_-ÄÜÖ]*)+)(:(\d+))?//i

    Klappt auch ganz gut, aber :-)

    http://www.test.de?test=123

    Weil der abschließende Slash nach der TLD fehlt?

    Ansonsten fällt mir da dieses schöne Beispiel ein:

    http://aktuell.de.selfhtml.org/tippstricks/programmiertechnik/email/index.htm

    Hier wird zwar die Syntax einer kompletten E-Mail-Adresse geprüft, aber der Host-Name ist ja ein Bestandteil davon.
    Um den Rest (den Query-String) noch richtig zu matchen, kannst du dir ja mal zusätzlich die URL-RFC reinziehen. Dort steht ausführlich, welche Zeichen erlaubt sind und welche nicht.

    Und dann wäre da noch ein etwas älteres Stück PHP-Code, dass ich mal vor langer Zeit gebastelt hatte. Es zerlegt eine URL mit PCRE in ihre Bestandteile. Es überprüft nicht auf sämtliche zulässigen Zeichen, sondern "matcht" nur auf die "Anker-Zeichen", die in einer URL die einzelnen Bestandteile trennen. Möglicherweise kannst du dir da was abkucken. Was allerdings fehlt, ist die Erkennung von Username und Passwort:

      
    function split_url(  
      $url = EMPTY_STRING  
    ) {  
      if($url == EMPTY_STRING) return(FALSE);  
      
      $prot  = '(([a-z]+):\/\/)?' ; // protocol  
      $host  = '([^\/:]+)'        ; // server/host  
      $port  = '(:(\d{1,5}))?'    ; // port  
      $ruri  = '(\/[^#]*)?'       ; // request uri  
      $ploc  = '(#(.*))?'         ; // location in web page  
      
      $rx_matches = array();  
      if( !preg_match(  
        '/\A'.$prot.$host.$port.$ruri.$ploc.'\Z/',  
        $url,  
        $rx_matches  
      ) ) return(FALSE);  
      
      // decoded url  
      $du = array(  
        'prot' => $rx_matches[2],  
        'host' => $rx_matches[3],  
        'port' => $rx_matches[5],  
        'ruri' => $rx_matches[6],  
        'ploc' => $rx_matches[8],  
      );  
      
      return($du);  
    }
    

    MffG
    EisFuX

    --
    Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
    Stanisław Lem