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