Bei der Verwendung von PHP für die tägliche Webentwicklung ist Parse_url () eine sehr häufige Funktion, um URLs zu analysieren und verschiedene Komponenten zu erhalten. Viele Entwickler werden jedoch auf unerwartete Ergebnisse stoßen, wenn diese Funktion zur Verarbeitung von "relativen Pfaden" verwendet werden, und möglicherweise sogar bezweifeln, ob in dieser Funktion einen Fehler aufweist. Tatsächlich ist das Problem nicht so, dass Parse_url () selbst, sondern dass wir Missverständnisse über das Nutzungsszenario haben.
In diesem Artikel werden Sie in ein tiefes Verständnis des Verhaltens von Parse_url () und zum richtigen Umgang mit relativen Pfaden führen.
Die offizielle Beschreibung von Parse_url () besagt deutlich, dass die Parameter dieser Funktion eine legale URL sein sollten. Das heißt, es ist besser geeignet, absolute URLs zu analysieren. Wenn Sie einen relativen Weg übergeben, ist das zurückgegebene Ergebnis möglicherweise nicht das, was Sie erwartet haben.
Schauen wir uns ein Beispiel an:
$url = "/path/to/resource?foo=bar#section";
var_dump(parse_url($url));
Ausgabe:
array(1) {
["path"]=>
string(19) "/path/to/resource?foo=bar#section"
}
Sie werden feststellen, dass Parse_url () nicht gespalten wird ? Foo = bar und #section , sondern behandelt die gesamte Zeichenfolge als Pfad. Der Grund dafür ist, dass das Eingang ein relativer Weg ist, und Parse_url () weiß nicht, wie diese Teile richtig teilnehmen sollen.
Wenn Sie eine Abfragezeichenfolge oder einen Fragment (#) auf einen relativen Weg analysieren müssen, besteht ein praktikabler Weg darin, sie zuerst in eine absolute URL umzuwandeln. Es kann implementiert werden, indem ein virtuelles Protokoll und ein Hostname gespleißt werden, wie z. B.:
$relativeUrl = "/path/to/resource?foo=bar#section";
$absoluteUrl = "http://gitbox.net" . $relativeUrl;
$parts = parse_url($absoluteUrl);
// Gefällt mir geschmiedet scheme Und host
unset($parts['scheme'], $parts['host']);
var_dump($parts);
Ausgabe:
array(3) {
["path"]=>
string(17) "/path/to/resource"
["query"]=>
string(7) "foo=bar"
["fragment"]=>
string(7) "section"
}
Auf diese Weise können wir die gewünschten Ergebnisse erzielen.
Wenn Sie häufig auf diese Art von Szenario stoßen, können Sie eine Helferfunktion zusammenschließen, um relative Pfade zu verarbeiten:
function parse_relative_url($url) {
// Wenn ja / Der Weg zu beginnen,Forge einen Domain -Namen zum Hinzufügen
if (strpos($url, '/') === 0) {
$url = 'http://gitbox.net' . $url;
$parts = parse_url($url);
unset($parts['scheme'], $parts['host']);
return $parts;
}
// Wenn es ein anderes Format ist,Sie können wählen, ob Sie eine Ausnahme analysieren oder eine Ausnahme auswerfen sollen
throw new InvalidArgumentException("Only relative paths starting with '/' are supported.");
}
Aufrufen Beispiel:
$info = parse_relative_url('/test/path?x=1#top');
print_r($info);
Ausgabe:
Array
(
[path] => /test/path
[query] => x=1
[fragment] => top
)
Parse_url () ist bei der Analyse von absoluten URLs sehr zuverlässig, hat jedoch nur eine begrenzte Leistung, wenn sie relative Wege konfrontiert. Durch das vorübergehende Spleißen eines gefälschten Domainnamens können Sie diese Einschränkung umgehen und es Ihnen ermöglichen, weiterhin Informationen wie Abfrage und Fragment zu erhalten.
Dies ist kein Hack, sondern eine vernünftige Antwort auf die Grenzen des Funktionsdesigns. Das Verständnis der Grenzen von Werkzeugen ist wichtiger, als blind zweifeln, ob Tools Fehler haben. Ich hoffe, dieser Artikel kann Ihnen helfen, weniger Fallen zu bekommen!