我有两个网址,我正在寻找最好的方法来决定它们是否相同。
示例:
$url1 = 'http://example.com/page.php?tab=items&msg=3&sort=title';
$url2 = 'http://example.com/page.php?tab=items&sort=title&msg=3';
在两个网址中只切换了sort
和msg
参数,所以我认为它们是相同的。
但是我不能简单地做if ( $url1 == $url2 ) { … }
我有一个URL列表,需要查找重复项,因此代码应该在循环内运行时快速。 (作为旁注:domain / page.php将始终相同,它只是关于通过params查找URL。)
答案 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)