Два URL идентичны? Игнорировать порядок параметров

У меня есть два URL-адреса, и я ищу лучший способ определить, идентичны ли они.

Пример:

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

В двух URL-адресах только sort а также msg параметры меняются, поэтому я считаю их равными.
Однако я не могу просто сделать if ( $url1 == $url2 ) { … }

У меня есть список URL-адресов и мне нужно найти дубликаты, поэтому код должен быть быстрым, поскольку он выполняется внутри цикла. (В качестве примечания: домен / page.php всегда будет одним и тем же, речь идет только о поиске URL по параметрам.)

0

Решение

Может быть так?

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

Другие решения

Не так просто, как может показаться, узнать, идентичен ли URI или нет, особенно если учесть здесь параметр запроса.

Один из распространенных способов сделать это — иметь функцию, которая нормализует 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)
1

По вопросам рекламы [email protected]