Matching URLs with normalisation/canonicalisation
-
07-04-2021 - |
문제
I found this solution to normalise and match equal URLs but I want to know if there is anything more elegant, doesn't PHP have a URL normalising function?
function urlMatch($url1, $url2)
{
// parse the urls
$r1 = parse_url($url1);
$r2 = parse_url($url2);
// get the variables out of the queries
parse_str($r1['query'], $v1);
parse_str($r2['query'], $v2);
// match the domains and paths
if ($r1['host'] != $r2['host'] || $r1['path'] != $r2['path'])
return false;
// match the arrays
foreach ($v1 as $key => $value)
if (array_key_exists($key, $v2) && $value != $v2[$key])
return false;
// if we haven't returned already, then the queries match
return true;
}
해결책
Something like this may be more suitable for your needs:
function urlMatch($url1, $url2){
// parse the urls
$r1 = parse_url($url1);
$r2 = parse_url($url2);
if (isset($r1['query'])){
// get the variables out of the query
parse_str($r1['query'], $v1);
// sort arguments so they be in exactly same order
asort($v1);
// place sorted arguments back
$r1['query'] = http_build_query($v1);
}
if (isset($r2['query'])){
parse_str($r2['query'], $v2);
asort($v2);
$r2['query'] = http_build_query($v2);
}
// Match re-constructed urls (you'll need pecl_http extension for this)
$matched = http_build_url($r1) === http_build_url($r2);
return $matched;
}
Update: I've changed code a bit to deal with empty queries...
제휴하지 않습니다 StackOverflow