两个网址是否相同?忽略参数顺序

时间:2014-12-27 12:22:06

标签: php url duplicates query-parameters

我有两个网址,我正在寻找最好的方法来决定它们是否相同。

示例:

$url1 = 'http://example.com/page.php?tab=items&msg=3&sort=title';
$url2 = 'http://example.com/page.php?tab=items&sort=title&msg=3';

在两个网址中只切换了sortmsg参数,所以我认为它们是相同的。 但是我不能简单地做if ( $url1 == $url2 ) { … }

我有一个URL列表,需要查找重复项,因此代码应该在循环内运行时快速。 (作为旁注:domain / page.php将始终相同,它只是关于通过params查找URL。)

2 个答案:

答案 0 :(得分:1)

也许是这样的?

function compare_url($url1, $url2){
  return (parse_url($url1,PHP_URL_QUERY) == parse_url($url2,PHP_URL_QUERY));
}

答案 1 :(得分:1)

找出URI是否相同,听起来并不容易,尤其是在此处考虑查询参数时。

执行此操作的一种常见方法是使用normalizes the URL函数,然后比较规范化的URI:

$url1 = 'http://example.com/page.php?tab=items&msg=3&sort=title';
$url2 = 'http://example.com/page.php?tab=items&sort=title&msg=3';

var_dump(url_nornalize($url1) == url_nornalize($url2)); # bool(true)

进入这样的规范化功能,您可以满足您的要求。首先,URL应根据规范进行标准化:

function url_nornalize($url, $separator = '&')
{
    // normalize according RFC 3986
    $url = new Net_URL2($url);
    $url->normalize();

然后您可以处理其他规范化步骤,例如,对查询的子部分进行排序:

    // normalize query if applicable
    $query = $url->getQuery();
    if (false !== $query) {
        $params = explode($separator, $query);
        sort($params);
        $query = implode($separator, $params);
        $url->setQuery($query);
    }

可以采取其他步骤,例如删除默认参数或不允许使用的参数,或重复的参数和不重复的参数。

最后返回标准化URL字符串

    return (string) $url;
}

对参数使用数组/哈希映射也不错,我只是想展示一种替代方法。完整的例子:

<?php
/**
 * http://stackoverflow.com/questions/27667182/are-two-urls-identical-ignore-the-param-order
 */

require_once 'Net/URL2.php';

function url_nornalize($url, $separator = '&')
{
    // normalize according RFC 3986
    $url = new Net_URL2($url);
    $url->normalize();

    // normalize query if applicable
    $query = $url->getQuery();
    if (false !== $query) {
        $params = explode($separator, $query);
        // remove empty parameters
        $params = array_filter($params, 'strlen');
        // sort parameters
        sort($params);
        $query = implode($separator, $params);
        $url->setQuery($query);
    }

    return (string)$url;
}

$url1 = 'http://EXAMPLE.com/p%61ge.php?tab=items&&&msg=3&sort=title';
$url2 = 'http://example.com:80/page.php?tab=items&sort=title&msg=3';

var_dump(url_nornalize($url1) == url_nornalize($url2)); # bool(true)