2011-12-28 10 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のコンテキストでは、「正規化」タグはデータベースの正規化を指します。正規化は、適切なタイプの専門家を引き付ける可能性が高くなります。 –

+0

この関数は間違っています! 'schema'と' port'はどうでしょうか?または、2番目のURLにのみ存在する追加の引数? –

+0

私はもっとエレガントで正しいものが必要だと思う:( –

答えて

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

アップデート:私は追加するには再びタグ付け