2011-03-24 3 views
2

я столкнулся с довольно необычной ситуациисоответствия URL на другой URL

у меня будет URL в любом из 3-х форматах:

  1. http://example.com/?p=12
  2. http://example.com/a-b/
  3. http://example.com/a.html

Теперь мне нужно совместить с URL-адресом, например

  1. http://example.com/?p=12&t=1
  2. http://example.com/a-b/?t=1
  3. http://example.com/a.html?t=1

Как я могу добиться этого? Пожалуйста, помогите

Я знаю, что я могу использовать как:

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

, но это также будет соответствовать, когда

http://example.com/?p=123 (as it matches p=12) 

Помощь ребята, пожалуйста.

ответ

2

Простым способом достижения этого является использование parse_url() и parse_str().

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

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

Возьмите URLs и запустить их через parse_url() и принимать полученный $result['query']. Запустите их через parse_str(), и вы получите два ассоциативных массива имен переменных и их значений.

В принципе, вы хотите вернуть true, если соответствие $result['path'] s, и если любые ключи, которые находятся в обоих $result['query'], содержат одинаковые значения. Пример

код:

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

@ IM-JM, существуют четкие и краткие примеры на справочных страницах, которые Мала связаны между собой. – Charles

+0

@ I-M-JM, я написал вам функцию, которая делает то, что я думаю, что вам нужно - она ​​сравнивает домены, пути, а затем убедитесь, что любые переменные, которые определены в * обеих цепочках запросов, должны быть равны. – Mala

+0

Функция urlMatch была весьма полезной, спасибо –

0

очень быстро (и несколько грязный) способ добиться этого с помощью следующего регулярного выражения:

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

Где $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 
Смежные вопросы