我已经讨论过将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('&','&',$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('&','&',$data).'" title="'.trim($title).'">'.trim($title).'</a></p>'."\n"; } elseif ( strlen($header) > 0 ) { $map .= '<p><a href="'.str_replace('&','&',$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;
该脚本将打印出站点映射,还将站点映射保存到文件中以供以后使用。这是必不可少的,因为由于必须执行所有页面访问,因此脚本可能需要很长时间才能运行。
该脚本相当复杂,自从我首次创建以来,已经经历了多个版本,因此,如果您发现任何改进或错误,请告诉我,我将其纳入其中。