使用PHP将sitemap.xml文件转换为HTML Sitemap
我已经讨论过将sitemap.xml文件转换为urllist.txt文件,但是如果要创建HTML网站映射该怎么办?如果您有sitemap.xml文件,则可以使用它来扩展您的网站,抓取每个页面的内容,然后使用此信息填充HTML文件。
以下代码执行此操作。对于每个页面,它将在页面上查找标题标签,描述元标签和第一个h2标签。这些项目然后用于构造该页面的HTML片段。
HTML Sitemap '; set_time_limit(400); $currentElement = ''; $currentLoc = ''; $map = "HTML Sitemap
"."\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 .= ''."\n"; $map .= 'A pdf document.
'."\n"; } elseif ( stripos($data, ".txt")>0 ) { //如果网址是文本文档 $map .= ''."\n"; $map .= 'A text document.
'."\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 .= ''.trim($title).(strlen($header)>0?" - ".trim($header):'').'
'."\n"; } elseif ( strlen($title) > 0 ) { $map .= ''."\n"; } elseif ( strlen($header) > 0 ) { $map .= ''."\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 .= ''.trim($description).'
'."\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 = ' '; //将输出写入文件 $fp = fopen('sitemap.html', "w+"); fwrite($fp,$header.$map.$footer); fclose($fp); //打印输出 echo $header.$map.$footer;
该脚本将打印出站点映射,还将站点映射保存到文件中以供以后使用。这是必不可少的,因为由于必须执行所有页面访问,因此脚本可能需要很长时间才能运行。
该脚本相当复杂,自从我首次创建以来,已经经历了多个版本,因此,如果您发现任何改进或错误,请告诉我,我将其纳入其中。