Php 如何创建具有页面关系的站点地图

Php 如何创建具有页面关系的站点地图,php,arrays,loops,sitemap,Php,Arrays,Loops,Sitemap,我目前正试图找到一种方法来编写一个脚本(更喜欢PHP),它可以在一个站点中爬行并创建一个站点地图。除了传统的标准页面列表之外,我希望脚本能够跟踪哪些页面链接到其他页面 示例页 A B C D 我想让输出给我如下的东西 页面名称:A 链接到页面A的页面: B C D 页码:B 链接到B页的页面: A. C 等等 我曾经遇到过多个标准的站点地图脚本,但是没有什么真正实现了我所寻找的 编辑 似乎我没有提供足够的信息。很抱歉我在这里不够清楚。这是我目前拥有的代码。我使用simple_html_dom.

我目前正试图找到一种方法来编写一个脚本(更喜欢PHP),它可以在一个站点中爬行并创建一个站点地图。除了传统的标准页面列表之外,我希望脚本能够跟踪哪些页面链接到其他页面

示例页

A
B
C
D
我想让输出给我如下的东西

页面名称:A

链接到页面A的页面:

B C D 页码:B

链接到B页的页面:

A. C 等等

我曾经遇到过多个标准的站点地图脚本,但是没有什么真正实现了我所寻找的

编辑 似乎我没有提供足够的信息。很抱歉我在这里不够清楚。这是我目前拥有的代码。我使用simple_html_dom.php为我处理解析和搜索html的任务

<?php

include("simple_html_dom.php");

url = 'page_url';

$html = new simple_html_dom(); 
$html->load_file($url);

$linkmap = array();

foreach($html->find('a') as $link):
    if(contains("cms/education",$link)):
        if(!in_array($link, $linkmap)):
            $linkmap[$link->href] = array();
        endif;
    endif;
endforeach;

?>
注意:我的小foreach循环只是根据url中的特定子字符串进行过滤


所以,我有必要的第一级页面。我遇到的困难是创建一个不会无限期运行的循环,同时跟踪您已经访问过的页面。

基本上,您需要两个数组来控制这里的流。第一个将跟踪您需要查看的页面,第二个将跟踪您已经查看的页面。然后,您只需在每个页面上运行现有代码,直到没有代码为止:

<?php

include("simple_html_dom.php");

$urlsToCheck = array();
$urlsToCheck[] = 'page_url';
$urlsChecked = array();

while(count($urlsToCheck) > 0)
{
   $url = array_pop($urlsToCheck);
   if (!in_array($url, $urlsChecked)
   {
      $urlsChecked[] = $url;

      $html = new simple_html_dom(); 
      $html->load_file($url);

      $linkmap = array();

      foreach($html->find('a') as $link):
          if(contains("cms/education",$link)):
              if((!in_array($link, $urlsToCheck)) && (!in_array($link,$urlsChecked)))
                 $urlsToCheck[] = $link;

              if(!in_array($link, $linkmap)):
                  $linkmap[$link->href] = array();
              endif;
          endif;
      endforeach;
   }
}

?>

基本上,这里需要两个数组来控制流。第一个将跟踪您需要查看的页面,第二个将跟踪您已经查看的页面。然后,您只需在每个页面上运行现有代码,直到没有代码为止:

<?php

include("simple_html_dom.php");

$urlsToCheck = array();
$urlsToCheck[] = 'page_url';
$urlsChecked = array();

while(count($urlsToCheck) > 0)
{
   $url = array_pop($urlsToCheck);
   if (!in_array($url, $urlsChecked)
   {
      $urlsChecked[] = $url;

      $html = new simple_html_dom(); 
      $html->load_file($url);

      $linkmap = array();

      foreach($html->find('a') as $link):
          if(contains("cms/education",$link)):
              if((!in_array($link, $urlsToCheck)) && (!in_array($link,$urlsChecked)))
                 $urlsToCheck[] = $link;

              if(!in_array($link, $linkmap)):
                  $linkmap[$link->href] = array();
              endif;
          endif;
      endforeach;
   }
}

?>

我已经更新了我的帖子,提供了更多需要的细节。谢谢你的更新,安迪。这是我们可以解决的问题:请记住投票/接受对你有帮助的答案。我已经更新了我的帖子,提供了更多关于需要什么的细节。谢谢你的更新,安迪。这是我们可以解决的问题:请记住投票/接受对您有帮助的答案。谢谢您的回复。看到你写这篇文章的方式对我来说肯定是有道理的,但在实践中,由于某种原因,我犯了一个致命的错误。我正试图找出原因,但也许你会马上知道。致命错误:嵌套级别太深-递归依赖?为行如果!在数组$link中,$urlsToCheck&&!在数组$link中,$urlsChecked:UPDATE:我发现了问题。in_数组是使用对象而不是我需要的特定值来完成的。这可能是因为对数组做了一些过度,因为$link本身也是一个数组。您可以尝试用$link->hrefThanks替换几乎所有的$link实例,除了在实际的foreach声明中。看到你写这篇文章的方式对我来说肯定是有道理的,但在实践中,由于某种原因,我犯了一个致命的错误。我正试图找出原因,但也许你会马上知道。致命错误:嵌套级别太深-递归依赖?为行如果!在数组$link中,$urlsToCheck&&!在数组$link中,$urlsChecked:UPDATE:我发现了问题。in_数组是使用对象而不是我需要的特定值来完成的。这可能是因为对数组做了一些过度,因为$link本身也是一个数组。您可以尝试用$link->href替换几乎所有的$link实例,实际的foreach声明除外