Meine PHP HTTP Library ist abhängig von einem korrektem URI Parsing, was
einen generischen URI Parser erfordert, daher habe ich einen gemeisselt.
Grundlegende Funktionsweise:
include "URI.inc";
$uri = new URI("http://www.bjoernsworld.de/")
print $uri->host()
Der Konstruktor der URI Klasse versucht das scheme der URI zu bestimmen;
danach mutiert die Klasse zu einer Klasse des URI schemes, im Fall oben
zu _http_url, falls das scheme unbekannt ist zu _unknown_url.
Die jeweilige Klasse erbt die Funktionen anderer Klassen, je nachdem
welche Information die URI in sich tragen kann, mindestens jedoch die
der Klasse _generic die Zugriff auf die Core-Komponenten einer URI gibt,
sprich:
URI: <scheme>:<opaque>#<fragment>
opaque: <authority><path><query>
Die URI Klasse übergibt beim mutieren dem neuen Konstruktor die URI,
welche dann in $this->{'uri_string'} gespeichert wird. Die
Core-Funktionen greifen jeweils auf diese Variable zu und extrahieren
den Teil, für den sie zuständig sind. Untergeordnete Funktionen wie z.B.
host() oder port() extrahieren ihre Informationen aus dem Teil, den
ihnen die Core-Funktionen zurückliefern, in dem Fall der beiden also
authority().
Beispielanwendung:
<?php
include "URI.inc";
$uri = new URI("HTTP://ix.de:80/index.html?query#frag");
$canonical = $uri->canonical();
print "URI: " . $uri->as_string() . "\n";
print "CANONICAL: " . $canonical->as_string()."\n";
print "scheme: " . $uri->scheme() . "\n";
print "opaque: " . $uri->opaque() . "\n";
print "authority: " . $uri->authority() . "\n";
print "host: " . $uri->host() . "\n";
print "port: " . $uri->port() . "\n";
print "path: " . $uri->path() . "\n";
print "query: " . $uri->query() . "\n";
print "fragment: " . $uri->fragment() . "\n\n";
$uri->scheme('ftp');
$uri->user('bjoern');
$uri->password('geheim');
$uri->host('cdrom.com');
$uri->port('21');
$uri->path_query('/pub/demos/demos/');
print "URI: " . $uri->as_string() . "\n";
print "userinfo: " . $uri->userinfo() . "\n";
print "user: " . $uri->user() . "\n";
print "password: " . $uri->password() . "\n\n";
?>
URI: HTTP://ix.de:80/index.html?query#frag
CANONICAL: http://ix.de/index.html?query#frag
scheme: http
opaque: //ix.de:80/index.html?query
authority: ix.de:80
host: ix.de
port: 80
path: /index.html
query: query
fragment: frag
URI: ftp://bjoern:geh...@cdrom.com:21/pub/demos/demos/#frag
userinfo: bjoern:geheim
user: bjoern
password: geheim
Die Klasse kann natürlich sowohl relative wie absolute URIs behandeln
und darüber hinaus eine URI absolut zu einer Basis-URI angeben (anhand
der Core-Funktion abs() (Umkehrfunktion rel() ist noch nicht
implementiert)).
Darüber hinaus gibt es noch eine URI_Escape Klasse die die beiden
Funktionen URI_Escape::uri_escape und URI_Escape::uri_unescape zur
Verfügung stellt. Erstere kann als zusätzliches Argument die Zeichen
entgegennehmen, die escaped werden sollen (innerhalb einer RegEx
Character Class).
Das gesamte Modul benötigt aus einer Reihe von Gründen mind. PHP 4.0.0.
Es basiert auf dem Perl URI Package von Gisle Aas.
Bisher implementierte Schemes sind http, https und ftp.
Das Modul ist noch im Alpha-Stadium und ich wäre an diesem Punkt
brennend an Vorschlägen und Bugs (die wohl primär bei %-encoded URIs
liegen werden) interessiert, wenn sich also jemand an der Entwicklung
beteiligen will, sei er herzlich willkommen; ich hätte natürlich grosses
Interesse an strukturellen Verbesserungen.
Eine Dokumentation gibt es bisher ebenfalls nicht, man kann ggf. auf
´perldoc URI´ zurückgreifen, ansonsten wird es die erst mit dem Release
geben. An sich sollte aber alles selbsterklärend sein.
Die Weiterentwicklung, sollte kein User-Input kommen, liegt vorerst auf
Eis, da die Lib. eigentlich kein Projekt ist, sondern nur Mittel zum
Zweck.
Zu finden ist die gesamte Bibliothek bei:
http://www.bjoernsworld.de/php/uri/current.tar.gz (LF)
http://www.bjoernsworld.de/php/uri/current.zip (CRLF)
Gruesse,
--
Björn Höhrmann ·· mailto:bjo...@hoehrmann.de ·· http://www.bjoernsworld.de
/* */
<?php eval(base64_decode('JHM9IjUyNzI2OTAwNDg0MDQ4MDA0MDY1Njc3NTY5ODIiO2Zvci'.
'gkaT0wOyRpPDI4OyRpKz0yKXByaW50IHBhY2soIkMiLHN1YnN0cigkcywkaSwyKSszMik7')); ?>