Regex, URL Check ...
Chrisi
- php
0 EisFuX
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
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