襄阳做网站,襄阳网站设计,襄阳网站开发,微信小程序开发,网站设计制作,专业建站公司

当前位置:

php原生开发生成网站地图

常见问题

2078

文章来源(hbsjsd.cn)湖北高端网站定制开发公司-速建时代

以下是一个php实现,可以通过指定URL获取页面链接。可以获取3层页面链接,同时也屏蔽外部链接和去除重复链接。

<?php

function getLinks($url, $depth){
  static $seen = array(); // 用于存储已经访问过的链接
  if (isset($seen[$url]) || $depth === 0) { // 如果已经访问过该链接或达到最大深度则直接返回
    return;
  }

  $seen[$url] = true; // 将当前链接标记为已访问

  $html = file_get_contents($url); // 获取html内容
  preg_match_all("/<a\s+(?:[^>]*?\s+)?href=(?:'([^']*)'|"([^"]*)")/si", $html, $matches); // 使用正则表达式匹配所有链接

  $links = array(); // 用于存储可用链接
  foreach ($matches[1] as $link) {
    if (!empty($link) && strpos($link, '#') !== 0) { // 如果链接不为空且不是锚点链接
      $absoluteLink = resolveLink($url, $link); // 获取绝对路径
      if (strpos($absoluteLink, 'javascript:') === false && isSameDomain($url, $absoluteLink)) { // 如果不是javascript链接且与原始链接同域名
        $links[] = $absoluteLink; // 存储链接
      }
    }
  }

  foreach ($links as $link) { // 遍历所有可用链接
    getLinks($link, $depth - 1); // 递归获取下一层链接
  }

  return array_unique($seen);
}

function resolveLink($base_url, $link){
  if (parse_url($link, PHP_URL_SCHEME)) {
    return $link; // 如果链接包含协议,则为绝对路径,直接返回
  }

  $base_url_parts = parse_url($base_url); // 获取原始链接的各个部分

  $path = '/' . ltrim($link, '/'); // 以'/'开头的路径为相对路径
  $base_path = $base_url_parts['path'];
  $base_path = preg_replace('#/[^/]*$#', '', $base_path); // 获取原始链接的上层路径

  $resolved_url = $base_url_parts['scheme'] . '://';
  $resolved_url .= $base_url_parts['host'];
  $resolved_url .= $base_path . $path;

  return rtrim($resolved_url, '/');
}

function isSameDomain($url1, $url2){
  $url1_parts = parse_url($url1);
  $url2_parts = parse_url($url2);

  return isset($url1_parts['host']) && isset($url2_parts['host']) && $url1_parts['host'] === $url2_parts['host'];
}

$url = 'http://example.com'; // 需要获取链接的页面URL
$depth = 3; // 最大深度

$links = getLinks($url, $depth);
print_r($links);

?>

上面的代码使用file_get_contents()函数获取HTML内容,并使用正则表达式匹配页面上的所有链接。匹配到的链接会被过滤,只保留同域名下的链接。过滤后的链接会递归地进行下一层的链接获取,并按照$depth参数指定的深度进行限制。所有获取到的链接会以数组形式返回。

如果需要屏蔽特定的链接,例如广告链接或者某些特定的外链,可以在代码中添加额外的判断逻辑即可。


下面是一个获取链接生成网站地图的php实现,可以将结果生成为txt、html、xml三种格式:

function generateSiteMap($url, $depth, $format) {
  $links = getLinks($url, $depth);
  switch($format) {
    case 'txt':
      saveAsTxt($links);
      break;
    case 'html':
      saveAsHtml($links);
      break;
    case 'xml':
      saveAsXml($links);
      break;
    default:
      echo 'Unsupported format';
  }
}

function saveAsTxt($links) {
  $sitemap = '';
  foreach($links as $link) {
    $sitemap .= $link . "\n";
  }
  file_put_contents('sitemap.txt', $sitemap);
}

function saveAsHtml($links) {
  $sitemap = '<html><head><title>Sitemap</title></head><body><ul>';
  foreach($links as $link) {
    $sitemap .= '<li><a href="' . $link . '">' . $link . '</a></li>';
  }
  $sitemap .= '</ul></body></html>';
  file_put_contents('sitemap.html', $sitemap);
}

function saveAsXml($links) {
  $sitemap = '<?xml version="1.0" encoding="UTF-8"?>
  <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
  foreach($links as $link) {
    $sitemap .= '<url><loc>' . $link . '</loc></url>';
  }
  $sitemap .= '</urlset>';
  file_put_contents('sitemap.xml', $sitemap);
}

该实现在原有获取链接的基础上添加了生成sitemap的功能,并根据format参数决定输出的文件格式。

  • saveAsTxt()函数将所有链接以一行一个的方式存储到txt文件中。

  • saveAsHtml()函数将所有链接以HTML的格式存储到html文件中。

  • saveAsXml()函数将所有链接以XML的格式存储到xml文件中。

例如,要将网站http://example.com的内容生成一个最大深度为3的sitemap.xml文件,可以调用以下代码:

generateSiteMap('http://example.com', 3, 'xml');

这将生成一个sitemap.xml文件,其中包含所有的链接。同时,可以根据需要生成txt和html格式的sitemap,只需将第三个参数改为'txt'或'html'即可。

[声明]原创不易,请转发者备注下文章来源(hbsjsd.cn)【速建时代】。

速建时代高端网站定制开发回到顶部
站内SEO关键词搜索