如何从URL获取所有可能的目录组合

时间:2013-03-17 00:54:30

标签: php algorithm sorting

我无法找出一种算法来检测网址列表中重复出现的目录模式,有人可以为此建议一种方法吗?我很确定它需要是一个递归调用,但我不能决定如何保存每个可能模式的记录。

注意:这是PHP格式。

有人说你有一些网址:

1. http://www.goodfood.com/recipes/special_occasion/desserts/pie/chocolate-pie.html
2. http://www.goodfood.com/recipes/special_occasion/desserts/pie/cherry-pie.html
3. http://www.goodfood.com/recipes/special_occasion/apps/chex-mix.html
4. http://www.goodfood.com/recipes/special_occasion/soup/tomato.html
5. http://www.goodfood.com/special/special_occasion/soup/beef-stew.html
6. http://www.goodfood.com/special/special_occasion/soup/vegetable.html

我想找到一种方法来确定多个url具有的所有可能的目录模式。所以结果看起来像这样:

'recipes/special_occasion' is found in urls 1, 2, 3 and 4.
'recipes/special_occasion/desserts' is found in urls 1, and 2.
'recipes/special_occasion/desserts/pie' is found in urls 1, and 2.
'special_occasion/desserts/pie' is found in urls 1, and 2.
'desserts/pie' is found in urls 1, and 2.
'special_occasion/desserts' is found in urls 1, and 2.
'special_occasion/desserts/pie' is found in urls 1, and 2.
'special/special_occasion' is found in urls 5, and 6.
'special/special_occasion/soup' is found in urls 5, and 6.
'special_occasion/soup' is found in urls 5, and 6.

我的想法是浏览每个网址并提取所有可能的新模式并将其存储在数组中。到目前为止,我有:          $ commonDomains = array();

     foreach($query AS $row) {


         $urlPath = parse_url($row['href'], PHP_URL_PATH);
         echo "$urlPath<br/>";

         $urlChunks = explode('/', $urlPath);
         //var_dump($urlChunks);

         foreach($urlChunks AS $domain) {
             if(strlen($domain) > 0) {
                $thisDomain = $domain.'/';
                $commonDomains[$thisDomain][] = $row['id'];
             }
         }
         var_dump($commonDomains);
     }

以前有没有人碰过这个?它尖叫着我的模式但我无法在网上找到答案。我想到的一切都变得非常复杂。请帮忙,谢谢。


我有一个我正在做的事情的例子:http://phpfiddle.org/main/code/kn4-zyh

到目前为止我的结果

/recipes/special_occasion/desserts/pie/grandmas-chocolate-pie.html
array(5) { [0]=> string(7) "recipes" [1]=> string(16) "special_occasion" [2]=> string(8) "desserts" [3]=> string(3) "pie" [4]=> string(27) "grandmas-chocolate-pie.html" } 

0 : 4 : recipes/special_occasion/desserts/pie/grandmas-chocolate-pie.html
0 : 3 : recipes/special_occasion/desserts/pie
0 : 2 : recipes/special_occasion/desserts
0 : 1 : recipes/special_occasion

1 : 4 : special_occasion/desserts/pie/grandmas-chocolate-pie.html
2 : 4 : desserts/pie/grandmas-chocolate-pie.html
3 : 4 : pie/grandmas-chocolate-pie.html

0 : 4 : recipes/special_occasion/desserts/pie/grandmas-chocolate-pie.html
1 : 3 : special_occasion/desserts/pie


**Im missing:
2 : 3 : special_occasion/desserts
1 : 2 : recipes/special_occasion

**

1 个答案:

答案 0 :(得分:0)

搜索一个目录的示例:

$links = array(
    'http://www.goodfood.com/recipes/special_occasion/desserts/pie/chocolate-pie.html',
    'http://www.goodfood.com/recipes/special_occasion/desserts/pie/cherry-pie.html',
    'http://www.goodfood.com/recipes/special_occasion/apps/chex-mix.html',
    'http://www.goodfood.com/recipes/special_occasion/soup/tomato.html',
    'http://www.goodfood.com/special/special_occasion/soup/beef-stew.html',
    'http://www.goodfood.com/special/special_occasion/soup/vegetable.html',
);

$dirs = array();
foreach ($links as $key => $link) {
    $urlPath = parse_url($link, PHP_URL_PATH);
    $arrayUrlPath = explode('/', $urlPath);
    $dirs[$key] = array();
    $counter = 0;
    foreach ($arrayUrlPath as $dir) {
        if (empty($dir) || in_array(substr($dir, -5), array('.html'))) {
            continue;
        }
        $dirs[$key][$counter++] = $dir;
    }
}

$searchDirs = $dirs;

foreach ($searchDirs as $key => $dir) {
    foreach ($dir as $name) {
        echo 'dir: ' . $name . ', found in: ' . search($name, $key, $dirs) . "\n";
    }
}

function search($name, $excludeKey, $dirs)
{
    $return = array();
    foreach ($dirs as $key => $dir) {
        if ($key === $excludeKey) {
            continue;
        }
        if (in_array($name, $dir)) {
            $return[] = (int)$key + 1;
        }
    }
    return join(', ', $return);
}

如果您想要搜索更长的字符串重建search功能,请为explode添加$name并为$key添加比较,如果目录为aaa/bbb/ccc,请检查{ {1}}是'aaa'且index 0index 1bbbindex 2ccc,除非移动指针index+1并再次检查。

我希望我帮助过。