常見問題

php原生開發(fā)生成網(wǎng)站地圖

常見問題

2652

字體:

以下是一個php實現(xiàn),可以通過指定URL獲取頁面鏈接??梢垣@取3層頁面鏈接,同時也屏蔽外部鏈接和去除重復(fù)鏈接。

<?php

function getLinks($url, $depth){
  static $seen = array(); // 用于存儲已經(jīng)訪問過的鏈接
  if (isset($seen[$url]) || $depth === 0) { // 如果已經(jīng)訪問過該鏈接或達到最大深度則直接返回
    return;
  }

  $seen[$url] = true; // 將當(dāng)前鏈接標記為已訪問

  $html = file_get_contents($url); // 獲取html內(nèi)容
  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; // 如果鏈接包含協(xié)議,則為絕對路徑,直接返回
  }

  $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()函數(shù)獲取HTML內(nèi)容,并使用正則表達式匹配頁面上的所有鏈接。匹配到的鏈接會被過濾,只保留同域名下的鏈接。過濾后的鏈接會遞歸地進行下一層的鏈接獲取,并按照$depth參數(shù)指定的深度進行限制。所有獲取到的鏈接會以數(shù)組形式返回。

如果需要屏蔽特定的鏈接,例如廣告鏈接或者某些特定的外鏈,可以在代碼中添加額外的判斷邏輯即可。


下面是一個獲取鏈接生成網(wǎng)站地圖的php實現(xiàn),可以將結(jié)果生成為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);
}

該實現(xiàn)在原有獲取鏈接的基礎(chǔ)上添加了生成sitemap的功能,并根據(jù)format參數(shù)決定輸出的文件格式。

  • saveAsTxt()函數(shù)將所有鏈接以一行一個的方式存儲到txt文件中。

  • saveAsHtml()函數(shù)將所有鏈接以HTML的格式存儲到html文件中。

  • saveAsXml()函數(shù)將所有鏈接以XML的格式存儲到xml文件中。

例如,要將網(wǎng)站http://example.com的內(nèi)容生成一個最大深度為3的sitemap.xml文件,可以調(diào)用以下代碼:

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

這將生成一個sitemap.xml文件,其中包含所有的鏈接。同時,可以根據(jù)需要生成txt和html格式的sitemap,只需將第三個參數(shù)改為'txt'或'html'即可。

[聲明]原創(chuàng)不易,請轉(zhuǎn)發(fā)者備注下文章來源(hbsjsd.cn)【速建時代】。