将url匹配到另一个url

时间:2011-03-24 06:35:33

标签: php

我面临着相当不寻常的情况

我将使用3种格式中的任何一种格式:

  1. http://example.com/?p=12
  2. http://example.com/a-b/
  3. http://example.com/a.html
  4. 现在,我需要匹配像

    这样的网址
    1. http://example.com/?p=12&t=1
    2. http://example.com/a-b/?t=1
    3. http://example.com/a.html?t=1
    4. 我怎样才能做到这一点?请帮忙

      我知道我可以使用:

      stristr('http://example.com/?p=12','http://example.com/?p=12&t=1')
      

      时也会匹配
      http://example.com/?p=123 (as it matches p=12)
      

      请帮帮我们。

2 个答案:

答案 0 :(得分:2)

实现此目的的一种简单方法是使用PHP的parse_url()parse_str()

http://www.php.net/manual/en/function.parse-url.php

http://www.php.net/manual/en/function.parse-str.php

获取您的网址并通过parse_url()运行它们,然后获取结果$result['query']。通过parse_str()运行这些,你最终会得到两个变量名及其值的关联数组。

基本上,如果$result['path']匹配,并且两个$result['query']中的任何键都包含相同的值,您将希望返回true。

代码示例:

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

答案 1 :(得分:0)

实现这一目标的一种非常快速(有点肮脏)的方法是通过以下正则表达式:

$regex = '#^' . preg_quote($url, '#') . '[?&$]#';

$url是您需要搜索的网址。在上面,我们在匹配正则表达式的开头查找URL,然后是?&或行尾锚点。这不是防弹但可能就足够了(@Mala already posted“正确”方法。

下面,我发布了example of use(和结果):

$urls = array(
    'http://example.com/?p=12',
    'http://example.com/a-b/',
    'http://example.com/a.html'
);
$tests = array(
    'http://example.com/?p=12&t=1',
    'http://example.com/a-b/?t=1',
    'http://example.com/a.html?t=1',
    'http://example.com/?p=123'
);

foreach ($urls as $url) {
        $regex = '#^' . preg_quote($url, '#') . '[?&$]#';
        print $url . ' - ' . $regex . "\n";
        foreach ($tests as $test) {
                $match = preg_match($regex, $test);
                print ' ' . ($match ? '+' : '-') . ' ' . $test . "\n";
        }
}

结果:

http://example.com/?p=12 - #^http\://example\.com/\?p\=12[?&$]#
 + http://example.com/?p=12&t=1
 - http://example.com/a-b/?t=1
 - http://example.com/a.html?t=1
 - http://example.com/?p=123
http://example.com/a-b/ - #^http\://example\.com/a-b/[?&$]#
 - http://example.com/?p=12&t=1
 + http://example.com/a-b/?t=1
 - http://example.com/a.html?t=1
 - http://example.com/?p=123
http://example.com/a.html - #^http\://example\.com/a\.html[?&$]#
 - http://example.com/?p=12&t=1
 - http://example.com/a-b/?t=1
 + http://example.com/a.html?t=1
 - http://example.com/?p=123