Je sais que ce problème semble être résolu par webbiedave, mais j'ai eu mes propres problèmes.
Premier problème: les caractères codés sont insensibles à la casse. Donc,% C3 et% c3 sont tous les deux exactement le même caractère, bien qu'ils soient différents comme URI. Les deux URI pointent donc vers le même emplacement.
Deuxième problème: le dossier% 20 (2) et le dossier% 20% 282% 29 sont tous deux des URI valablement codés en url, qui pointent vers le même emplacement, bien qu'il s'agisse d'URI différents.
Troisième problème: Si je me débarrasse des caractères codés en url, j'ai deux emplacements ayant le même URI comme bla% 2Fblubb et bla/blubb.
Alors que faire alors? Afin de comparer deux URIs, j'ai besoin de les normaliser tous les deux de manière à les séparer dans tous les composants, urdecoder tous les chemins et parties de requêtes pour une fois, les écraser et les coller ensemble et ensuite les comparer.
Et cela pourrait être la fonction de la normaliser:
function normalizeURI($uri) {
$components = parse_url($uri);
$normalized = "";
if ($components['scheme']) {
$normalized .= $components['scheme'] . ":";
}
if ($components['host']) {
$normalized .= "//";
if ($components['user']) { //this should never happen in URIs, but still probably it's anything can happen thursday
$normalized .= rawurlencode(urldecode($components['user']));
if ($components['pass']) {
$normalized .= ":".rawurlencode(urldecode($components['pass']));
}
$normalized .= "@";
}
$normalized .= $components['host'];
if ($components['port']) {
$normalized .= ":".$components['port'];
}
}
if ($components['path']) {
if ($normalized) {
$normalized .= "/";
}
$path = explode("/", $components['path']);
$path = array_map("urldecode", $path);
$path = array_map("rawurlencode", $path);
$normalized .= implode("/", $path);
}
if ($components['query']) {
$query = explode("&", $components['query']);
foreach ($query as $i => $c) {
$c = explode("=", $c);
$c = array_map("urldecode", $c);
$c = array_map("rawurlencode", $c);
$c = implode("=", $c);
$query[$i] = $c;
}
$normalized .= "?".implode("&", $query);
}
return $normalized;
}
Maintenant, vous pouvez modifier la fonction de webbiedave à ceci:
function uriMatches($uri1, $uri2) {
return normalizeURI($uri1) === normalizeURI($uri2);
}
Cela devrait faire. Et oui, c'est plus compliqué que je ne le voulais.
hah. quelle solution simple et évidente! agréable. +1 –