Ich bin vor kurzem auf einen Blog-Artikel gestoßen, den ich hier in eigenen Worten mal im Deutschen wiedergeben will. Wenn ich überlege, wie oft ich mich mit URL-Parsing herumgestritten habe, ist es mir fast schon peinlich zu schreiben, dass ich diese Funktionen bis heute nicht kannte.
parse_url
Als Rückgabe erhält man ein assoziatives Array, wenn man dieser Funktion eine URL übergibt. Man stelle sich diese URL vor:
scheme://username:password {at} host(.)tld:80/path/?a=b&c=d#fragment
Das Ergebnis, welches parse_url bei Übergabe dieses Strings ausgibt, sieht so aus:
Array ( [scheme] => "http" [host] => "host.tld" [user] => "username" [pass] => "password" [path] => "/path" [port] => 80 [query] => "a=b&c=d" [fragment] => "fragment" )
Es ist möglich einen zweiten Parameter zu übergeben, um nur einen String aus dem Array zu erhalten, möglich sind:
PHP_URL_SCHEME, PHP_URL_HOST, PHP_URL_PORT, PHP_URL_USER, PHP_URL_PASS, PHP_URL_PATH, PHP_URL_QUERY oder PHP_URL_FRAGMENT
Wichtig:
- das ganze klappt nicht für relative URLs
- es sollte nicht zur URL-Validierung genutzt werden, da die Funktion nur splittet, ohne auf Richtigkeit zu achten
- auf URL-Teile angewandt, klappt die Funktion auch
http_build_query
Die Funktion baut aus aus einem assoziativem Array den Teil einer URL, der hinterm ? steht. Beispiel:
$data = array("a" => "b", "c" => "d"); echo http_build_query($data); Output: a=b&c=d
Die aktuelle URL auslesen
Hierfür gibt es anscheinen keinen wirklich schönen, fertigen Weg, deshalb hier eine Funktion, die ich wohl ohne Kommentar so stehen lassen kann, welche diese Aufgabe erledigt:
function current_url() { $isHTTPS = ( isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on" ); $isPort = ( isset($_SERVER["SERVER_PORT"]) && ((!$isHTTPS && $_SERVER["SERVER_PORT"] != "80") || ($isHTTPS && $_SERVER["SERVER_PORT"] != "443"))); $port = ( $isPort ) ? ( ':'.$_SERVER["SERVER_PORT"] ) : ''; $url = ( $isHTTPS ? 'https://' : 'http://').$_SERVER["SERVER_NAME"].$port.$_SERVER["REQUEST_URI"]; return $url; }
Gibts noch mehr URL Funktionen, die ihr für sinnvoll haltet?