2011-12-28 95 views
1

我发现此解决方案规范化并匹配相同的URL,但我想知道是否有更优雅的东西,PHP不具有URL规范化功能?使用规范化/规范化匹配URL

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; 
} 
+0

重新标记添加规范化和消除规范化。在SO的上下文中,“标准化”标签是指数据库标准化。规范化更有可能吸引合适类型的专家。 – 2011-12-28 03:32:42

+0

此功能错误!那么'schema'和'port'呢?或其他参数只存在于第二个网址? – 2011-12-28 03:37:27

+0

我想我现在需要更优雅更正确的东西:( – 2011-12-28 03:43:38

回答

1

像这样的东西可能会满足您的需求更适合:

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; 
} 

更新:我已经改变了代码一点对付空查询...