php生成静态html页面方法

 更新时间:2016年11月25日 16:03  点击:1832
下面讲的是用php生成静态html页面方法哦,方法有几种,各位朋友可以根据自己的实际情况来实现。

第一种:利用模板。目前PHP的模板可以说是很多了,有功能强大的smarty,还有简单易用的smarttemplate等。它们每一种模板,都有一个获取输出内容的函数。我们生成静态页面的方法,就是利用了这个函数。用这个方法的优点是,代码比较清晰,可读性好。
这里我用smarty做例子,说明如何生成静态页
require('smarty/Smarty.class.php');
$t = new Smarty;
$t->assign("title","Hello World!");
$content = $t->fetch("templates/index.htm");
//这里的 fetch() 就是获取输出内容的函数,现在$content变量里面,就是要显示的内容了
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>
第二种方法:利用ob系列的函数。这里用到的函数主要是 ob_start(), ob_end_flush(), ob_get_content(),其中ob_start()是打开浏览器缓冲区的意思,打开缓冲后,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区,直到你使用了ob_end_flush().而这里最重要的一个函数,就是ob_get_contents(),这个函数的作用是获取缓冲区的内容,相当于上面的那个fetch(),道理一样的。代码:
ob_start();
echo "Hello World!";
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("archives/2005/05/19/0001.html", "w");
fwrite($fp, $content);
fclose($fp);
?>
我选用的第2种方法 也就是用ob系列的函数
我刚开始看这个的时候有点不太明白 后来才知道ob是output buffering的意思 也就是输出缓存
当你准备输出的时候 所有的数据都保存在ob里面 服务器解析完php以后 把所有要输出到客户端的html代码都存放在ob里面 如果我们要输出html静态页面 只要把缓存取出来写入一个html页面即可
所以原理其实是很简单的
这里用到了几个函数 由于我初学php 很多函数我还不了解 所以这里也说明一下 希望可以帮助大家
ob_start():开始“捕捉”缓存 也就是从这里开始 打开浏览器的缓存
ob_end_flush():关闭浏览器缓存
ob_get_content():读取缓存内容
fopen("文件路径","打开模式")打开文件 97xxoo这个函数的打开模式有好几种 下面介绍几种主要的模式:
'r' 只读方式打开,将文件指针指向文件头。??
'r+' 读写方式打开,将文件指针指向文件头。??
'w' 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。??
'w+' 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。??
fwrite("文件名称","写入内容") 写入文件
fclose() 关闭文件
由于我要转换的html文件非常多 可能有几百个 所以这里不能静态指定fopen的路径 大家可以设置一个路径变量 里面可以保存用户传来的id等信息 方便进行html文件命名 下面是我结合上次php读取xml数据的一个简单例子 程序代码
ob_start();????????????//打开浏览器缓存
?>
//下面是读取xml数据
$parser = xml_parser_create(); //创建一个parser编辑器
xml_set_element_handler($parser, "startElement", "endElement");//设立标签触发时的相应函数 这里分别为startElement和endElenment
xml_set_character_data_handler($parser, "characterData");//设立数据读取时的相应函数
$xml_file="1.xml";//指定所97gan要读取的xml文件,可以是url
$filehandler = fopen($xml_file, "r");//打开文件
while ($data = fread($filehandler, 4096))
{
xml_parse($parser, $data, feof($filehandler));
}//每次取出4096个字节进行处理
fclose($filehandler);
xml_parser_free($parser);//关闭和释放parser解析器
$name=false;
$position=false;
function startElement($parser_instance, $element_name, $attrs) //起始标签事件的函数
{
global $name,$position;??
if($element_name=="NAME")
{
$name=true;
$position=false;
echo "名字:";
}
if($element_name=="POSITION")
{$name=false;
$position=true;
echo "职位:";
}
}
function characterData($parser_instance, $xml_data) //读取数据时的函数
//此教程来源于97xxoo教程网(www.97xxoo.org)
查看完整的教程请点:http://www.97xxoo.org/article/1/2008/20081123423.shtml
{
??global $name,$position;
??if($position)
echo $xml_data."
";
if($name)
echo $xml_data."
";
}
function endElement($parser_instance, $element_name) //结束标签事件的函数
{
global $name,$position;
$name=false;
$position=false;
}
?>
//xml数据读取完毕
$htmlname=$id.".html";??????????????????????????//$id可以自己定义 这里代表用户传来的id
$htmlpath="archives/".$htmlname;?????? //设置路径变量
$content = ob_get_contents();??????????????//取得php页面输出的全部内容
$fp = fopen($htmlpath, "w");
fwrite($fp, $content);
fclose($fp);
?>

采集在现在的cms中都常常用到哦,下面我们就来看看关于php 正则表达式 取标题,关键词,内容代码源码哦。

//获取标题
  $inarr = array();
  preg_match("/<title>(.*)</title>/isU",$body,$inarr);
  if(isset($inarr[1]))
  {
   $redatas['title'] = $inarr[1];
  }

  //获取关键词
  $inarr = array();
  preg_match("/<meta[s]+name=['"]keywords['"] content=['"](.*)['"]/isU",$body,$inarr);
  if(isset($inarr[1]))
  {
   $redatas['keywords'] = cn_substr(html2text($inarr[1]),30);
  }

  //获取摘要
  $inarr = array();
  preg_match("/<meta[s]+name=['"]description['"] content=['"](.*)['"]/isU",$body,$inarr);
  if(isset($inarr[1]))
  {
   $redatas['description'] = cn_substr(html2text($inarr[1]),$cfg_auot_description);
  }

  //获取内容
  if($s!='' && $e!='')
  {
   $redatas['body'] = GetHtmlAreaA($s,$e,$body);
   if($redatas['body']!='' && $redatas['description']=='')
   {
    $redatas['description'] = cn_substr(html2text($redatas['body']),$GLOBALS['cfg_auot_description']);
   }
  }
 }
 return $redatas;

提供一款查询收录时常用的google正则表达式功能哦,我们是取得内容然后再正则出我们想要的内容,再在本地输出。

$TheUrl="http://www.google.cn/search?q=+site:".$q."&num=20&complete=1&hl=zh-CN&lr=&newwindow=1&as_qdr=".$t."&start=".$p."&sa=N";

 $TheThie=GetPage($TheUrl);
}
 $TheBody=GetContent($TheThie,"<div id=res class=med>","<div id=bsf style");
    $TheBody=iconv( "UTF-8", "gb2312//IGNORE" , $TheBody);
 $TheBody=str_replace("<!--z--><p><i>","<!--z--><!--<p><i>",$TheBody);
 $TheBody=str_replace('<br clear="all"/>','<br clear="all"/>',$TheBody);
    $TheBody=preg_replace('<a href="/search?num=20(.+?)amp;as_qdr=(.+?)&amp;q=site:(.+?)&amp;start=(.+?)&amp;sa=N">','a href=?q=$3&t=$2&p=$4>&nbsp;&nbsp;&nbsp;&nbsp;<!--z--',$TheBody);
 $TheBody=str_replace("该网站可能含有恶意软件,有可能会危害您的电脑。","",$TheBody);
 $TheBody=str_replace("/interstitial?url=","",$TheBody);
 $TheBody=str_replace("- <nobr>","",$TheBody);
 $TheBody=str_replace("类似网页","",$TheBody);
        $total=GetContent($TheThie,"</b></div><p>","</b> - <b>");
        $total=iconv( "UTF-8", "gb2312//IGNORE" , $total);
        $total=GetContent($total,"有 <b>","</b> 项");
 $total=str_replace("有 <b>","",$total);
 $total=str_replace(",","",$total);
        $total=intval($total);

提供一款超好的php 文件分页代码 上一页 下一页哦,这一款是dedecms的生成页面时的分页程序代码。

function GetPagebreakDM($totalPage,$nowPage,$aid)
 {
  global $cfg_rewrite;
  if($totalPage==1)
  {
   return "";
  }
  $PageList = "<li><a>共".$totalPage."页: </a></li>";
  $nPage = $nowPage-1;
  $lPage = $nowPage+1;
  if($nowPage==1)
  {
   $PageList.="<li><a href='#'>上一页</a></li>";
  }
  else
  {
   if($nPage==1)
   {
    $PageList.="<li><a href='view.php?aid=$aid'>上一页</a></li>";
    if($cfg_rewrite == 'Y')
    {
     $PageList = preg_replace("/.php?aid=(d+)/i",'-\1-1.html',$PageList);
    }
   }
   else
   {
    $PageList.="<li><a href='view.php?aid=$aid&pageno=$nPage'>上一页</a></li>";
    if($cfg_rewrite == 'Y')
    {
     $PageList = str_replace(".php?aid=","-",$PageList);
     $PageList =  preg_replace("/&pageno=(d+)/i",'-\1.html',$PageList);
    }
   }
  }
  for($i=1;$i<=$totalPage;$i++)
  {
   if($i==1)
   {
    if($nowPage!=1)
    {
     $PageList.="<li><a href='view.php?aid=$aid'>1</a></li>";
     if($cfg_rewrite == 'Y')
     {
      $PageList = preg_replace("/.php?aid=(d+)/i",'-\1-1.html',$PageList);
     }
    }
    else
    {
     $PageList.="<li class="thisclass"><a>1</a></li>";
    }
   }
   else
   {
    $n = $i;
    if($nowPage!=$i)
    {
     $PageList.="<li><a href='view.php?aid=$aid&pageno=$i'>".$n."</a></li>";
     if($cfg_rewrite == 'Y')
     {
      $PageList = str_replace(".php?aid=","-",$PageList);
      $PageList =  preg_replace("/&pageno=(d+)/i",'-\1.html',$PageList);
     }
    }
    else
    {
     $PageList.="<li class="thisclass"><a href='#'>{$n}</a></li>";
    }
   }
  }
  if($lPage <= $totalPage)
  {
   $PageList.="<li><a href='view.php?aid=$aid&pageno=$lPage'>下一页</a></li>";
   if($cfg_rewrite == 'Y')
   {
    $PageList = str_replace(".php?aid=","-",$PageList);
    $PageList =  preg_replace("/&pageno=(d+)/i",'-\1.html',$PageList);
   }
  }
  else
  {
   $PageList.= "<li><a href='#'>下一页</a></li>";
  }
  return $PageList;
 }

下面我们来看看用php生成html静态页面的程序吧,是一个很简单的类哦,好了费话不说多了来看看吧。

class Makehtml{
   public $MbUrl,$OutUrl,$AllHtml,$SouChar,$ObjChar; //变量
   public $row; //游标
   public $Shuzusou,$Shuzuobj; //替换的字符串数组
   //-----------------------初始化-------------------------
    function __construct(){ //初始化
     $this->MbUrl="";
     $this->OutUrl="";
     $this->AllHtml="";
     $this->Sql="";
     $this->SouChar="";
     $this->ObjChar="";
    }
  
  
   //-----------------------------自动按字段替换---------------------------
    function AutoReplace(){
      //------------------自动获取要替换的字符串-------------------
      $tlen=count($row);
      $shuzu1=array();
      $shuzu2=array();
      if($row){
      $i=0;
      foreach($row as $key => $value){     
     $shuzu2[i]="<=$".$key."$>";
     $shuzu1[i]=$value; 
     $i++;
      }
      $this->Replacehtml(shuzu2,shuzu1);
      }
      //------------------自动获取要替换的字符串-------------------
    }
   //-----------------------------自动按字段替换完成------------------------
  
  
   //-----------------------------批量替换数组--------------------------
   function Replacehtml($Shuzusou,$Shuzuobj){  //批量替换数组
    if(count($Shuzusou)!=count($Shuzuobj)){
      exit("替换数组不匹配");
    }
    if($this->AllHtml==""){
      exit("没有要替换的内容");   
    }
    for($i=0;$i<count($Shuzusou);$i++){
     $this->AllHtml=str_replace($Shuzusou[$i],$Shuzuobj[$i],$this->AllHtml);
     //print("<br>".$Shuzusou(i)."=".$Shuzuobj(i)."<br>")
   }
   }
   //-----------------------------批量替换数组完成--------------------------
  
   //-----------------------------读取文件---------------------------------
    function Readfile(){
     $file=fopen($this->MbUrl,"r");
     $fsize=filesize($this->MbUrl);
     $this->AllHtml=fread($file,$fsize);
     fclose($file);
       }  
   //-----------------------------读取文件完成------------------------------
   //-----------------------------保存文件---------------------------------
   function SaveFile(){
    $file=fopen($this->OutUrl,"w");
    fwrite($file,$this->AllHtml);
    fclose($file);
   }
   //-----------------------------保存文件完成------------------------------
}
//------------------------------生成静态的类完成--------------------------------------


 $MyMake=new Makehtml;
     $MyMake->MbUrl="News_Show.shtml";
     $MyMake->Readfile();
     $THTml=$MyMake->AllHtml;
     $shuzu1=array();
     $shuzu2=array();
     $shuzu1[0]="<=$keybord$>";
     $shuzu1[1]="<=$description$>";
     $shuzu1[2]="<=$title$>";
     $shuzu1[3]="<=$Title1$>";
     $shuzu1[4]="<$=Bid$>";
     $shuzu1[5]="<$=Id$>";
     $shuzu1[6]="<=$Contentb$>";
     $shuzu1[7]="<$=BigId$>";
     $shuzu1[8]="<=$Date$>";
     $shuzu1[9]="<=$City$>";
     $shuzu1[10]="<=$SmallId$>";
     $shuzu1[11]="<=$CityId$>";
     $shuzu1[12]="width="100%"";
     $MyMake->OutUrl="News_show_1.shtml";
     $shuzu2[0]="数组0";
     $shuzu2[1]="数组1";
     $shuzu2[2]="数组2";
     $shuzu2[3]="数组3"; 
     $shuzu2[4]="数组4";       
     $shuzu2[5]="数组5";
     $shuzu2[6]="数组6";
     $shuzu2[7]="数组7";
     $shuzu2[8]="数组8";
     $shuzu2[9]="数组9";
     $shuzu2[10]="数组10";
     $shuzu2[11]="数组11";
     $shuzu2[12]="width="95%"";
     $MyMake->Replacehtml($shuzu1,$shuzu2);
     $MyMake->SaveFile();

[!--infotagslink--]

相关文章

  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25
  • js控制页面控件隐藏显示的两种方法介绍

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: 复制代码 代码如下: document.all["panelsms"].style.visibility="hidden"; document.all["panelsms"].style.visi...2013-10-13
  • 连接MySql速度慢的解决方法(skip-name-resolve)

    最近在Linux服务器上安装MySql5后,本地使用客户端连MySql速度超慢,本地程序连接也超慢。 解决方法:在配置文件my.cnf的[mysqld]下加入skip-name-resolve。原因是默认安装的MySql开启了DNS的反向解析。如果禁用的话就不能...2015-10-21
  • C#方法的总结详解

    本篇文章是对C#方法进行了详细的总结与介绍,需要的朋友参考下...2020-06-25
  • Zend studio文件注释模板设置方法

    步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
  • EXCEL数据上传到SQL SERVER中的简单实现方法

    EXCEL数据上传到SQL SERVER中的方法需要注意到三点!注意点一:要把EXCEL数据上传到SQL SERVER中必须提前把EXCEL传到服务器上.做法: 在ASP.NET环境中,添加一个FileUpload上传控件后台代码的E.X: 复制代码 代码如下: if...2013-09-23
  • mysql锁定单个表的方法

    mysql锁定单个表的方法 复制代码 代码如下:mysql>lock table userstat read; mysql>unlock tables; 页级的典型代表引擎为BDB。 表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。 行级的典型代表引擎为INN...2014-05-31