使用PHP将sitemap.xml文件转换为HTML Sitemap

我已经讨论过将sitemap.xml文件转换为urllist.txt文件,但是如果要创建HTML网站映射该怎么办?如果您有sitemap.xml文件,则可以使用它来扩展您的网站,抓取每个页面的内容,然后使用此信息填充HTML文件。

以下代码执行此操作。对于每个页面,它将在页面上查找标题标签,描述元标签和第一个h2标签。这些项目然后用于构造该页面的HTML片段。

<?php
$header = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>HTML Sitemap</title>
</head>
<body>';
 
set_time_limit(400);
 
$currentElement = '';
$currentLoc = '';
 
$map = "<h1>HTML Sitemap</h1>"."\n";
 
function parsePage($data)
{
 global $map;
 /*
 if you want to trap a certain file extention then use the syntax below...
 stripos($data, ".php")>0
 stripos($data, ".htm")>0
 stripos($data, ".asp")>0
 */
 if ( stripos($data,".pdf") > 0 ) {
  // 如果网址是pdf文件。
  $map .= '<p><a href="'.$data.'">PDF document.</a></p>'."\n";
  $map .= '<p>A pdf document.</p>'."\n";
 } elseif ( stripos($data, ".txt")>0 ) {
  // 如果网址是文本文档
  $map .= '<p><a href="'.$data.'">Text document.</a></p>'."\n";
  $map .= '<p>A text document.</p>'."\n";
 } else {
  // 尝试以任何方式打开它...
  // 确保您可以读取文件
  if ( $urlh = @fopen($data, 'rb') ) {
   $contents = '';
   //检查PHP版本
   if ( phpversion()>5 ) {
    $contents = stream_get_contents($urlh);
   } else {
    while ( !feof($urlh) ) {
     $contents .= fread($urlh, 8192);
    };
   };
 
   // 找到标题
   preg_match('/(?<=\<[Tt][Ii][Tt][Ll][Ee]\>)\s*?(.*?)\s*?(?=\<\/[Tt][Ii][Tt][Ll][Ee]\>)/U', $contents, $title);
   $title = $title[0];
 
   // 找到第一个h1标签
   $header = array();
   preg_match('/(?<=\<[Hh]2\>)(.*?)(?=\<\/[Hh]2\>)/U', $contents, $header);
   $header = strip_tags($header[0]);
 
   if ( strlen($title) > 0 && strlen($header) > 0 ) {
    // 组合显示标题和h1标签
    $map .= '<p><a href="'.str_replace('&','&amp;',$data).'" title="'.(strlen($header)>0?trim($header):trim($title)).'">'.trim($title).(strlen($header)>0?" - ".trim($header):'').'</a></p>'."\n";
   } elseif ( strlen($title) > 0 ) {
    $map .= '<p><a href="'.str_replace('&','&amp;',$data).'" title="'.trim($title).'">'.trim($title).'</a></p>'."\n";
   } elseif ( strlen($header) > 0 ) {
    $map .= '<p><a href="'.str_replace('&','&amp;',$data).'" title="'.trim($header).'">'.trim($header).'</a></p>'."\n";
   };
 
   // 查找描述
   preg_match('/(?<=\<[Mm][Ee][Tt][Aa]\s[Nn][Aa][Mm][Ee]\=\"[Dd]escription\" content\=\")(.*?)(?="\s*?\/?\>)/U', $contents, $description);
   $description = $description[0];
 
   // 打印说明
   if ( strlen($description)>0 ) {
    $map .= '<p>'.trim($description).'</p>'."\n";
   };
   // 关闭档案
   fclose($urlh);
  };
 };
};
 
/////////// XML PARSE FUNCTIONS HERE /////////////
// 起始元素功能
function startElement($xmlParser, $name, $attribs)
{
 global $currentElement;
 $currentElement = $name;
};
 
// 结束元素功能
function endElement($parser, $name)
{
 global $currentElement,$currentLoc;
 if ( $currentElement == 'loc') {
  parsePage($currentLoc);
  $currentLoc = '';
 };
 $currentElement = '';
};
 
// 字符数据功能
function characterData($parser, $data) 
{
 global $currentElement,$currentLoc;
 // 如果当前元素是loc,那么它将是一个url
 if ( $currentElement == 'loc' ) {
  $currentLoc .= $data;
 };
};
 
// 创建解析对象
$xml_parser = xml_parser_create();
// 关闭案例折叠!
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
// 设置开始和结束元素功能
xml_set_element_handler($xml_parser,"startElement", "endElement");
// 设置字符数据功能
xml_set_character_data_handler($xml_parser, "characterData");
 
// 打开xml文件
if ( !($fp = fopen('sitemap.xml', "r")) ) {
 die("could not open XML input");
};
 
// 读取文件-如果出现问题,则打印错误。
while ( $data = fread($fp,4096) ) {
 if ( !xml_parse($xml_parser, $data,feof($fp)) ) {
  die(sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser)));
 };
};
 
// 关闭档案
fclose($fp);
 
$footer = '</body>
</html>';
 
// 将输出写入文件
$fp = fopen('sitemap.html', "w+");
fwrite($fp,$header.$map.$footer);
fclose($fp);
 
// 打印输出
echo $header.$map.$footer;

该脚本将打印出站点映射,还将站点映射保存到文件中以供以后使用。这是必不可少的,因为由于必须执行所有页面访问,因此脚本可能需要很长时间才能运行。

该脚本相当复杂,自从我首次创建以来,已经经历了多个版本,因此,如果您发现任何改进或错误,请告诉我,我将其纳入其中。