新聞動態

                                                                                  位置:首頁 新聞動態 常見問題

                                                                                  php原生開發生成網站地圖

                                                                                  新聞動態
                                                                                  2023年06月19日 閱讀:3018次

                                                                                  以下是一個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'即可。

                                                                                  上一篇

                                                                                  下一篇

                                                                                  亚洲中文字幕在线19页_99久久国产精品免费热7788_欧美专区日韩专区综合专区_小泽玛利亚一区_gogo999亚洲肉体艺术