下面我来分析了长文章分页与文章分页程序代码,有需要的朋友可参考参考。
办法一、按字数控制进行分页
按字数分页办法简单易用,但效果不好。
大致思想:首先、设定每页能容纳的最大字数;然后、计算文章内容的总字数,再由总字数和单页最大字数计算出出总页数。这样整个分页的准备工作就已经做好了。
具体到每一页的显示内容可以通过内容截取来实现。比如:页容纳500字,文章内容有2200字,那么当页面传递page=2时应该显示第501至1000之间的内容。
这种办法简单,但显示时可能会遇到麻烦,文章内容通常伴有HTML标签,进行内容切割时实现HTML标签的闭合有一定难度,如果这个工作没做好,那么分页后的效果显然也是不好的。
代码如下 |
复制代码 |
<?php
$content1="内容要很长。。。。。。";
$current=$_REQUEST['page_t'];
$result=ff_page($content1,$current);
echo $result;
function ff_page($content,$page)
{
global $expert_id;
if (empty($page)) {
$page = 1 ;
} //给$page赋初始值
$PageLength = 2000; //每页字数
$CLength = strlen($content); //文章长度
$PageCount = floor(($CLength / $PageLength)) + 1; //计算页数
$PageArray=array();//断页位置数组
$Seperator = array("n","r","。","!","?",";",",","”","’",".","!","?",";"); //分隔符号
//echo "页数:".$PageCount."<br >";
//echo "长度:".$CLength."<br >";
//strpos() 函数返回字符串在另一个字符串中第一次出现的位置
if($CLength <= $PageLength)
{
echo $content;
}//如果只有一页,直接打印
else{
$PageArray[0]=0;
$Pos = 0;
$i=0;
//第一页,print_r($Seperator);
for( $j=0 ; $j < sizeof($Seperator); $j++)
{
$Pos=strpos($content,$Seperator[$j],$PageArray[$i]+1900);
while($Pos > 0 && $Pos<($i+1)*$PageLength && $Pos > $i*$PageLength )
{
$PageArray[$i] = $Pos ;
if ($Pos+$PageLength > $CLength)
{
$start_p = $CLength-1 ;
}
else{
$start_p = $Pos+$PageLength ;
}
//给一个找寻位置的起始点,防止超过位置总字符数
$Pos = strpos($content,$Seperator[$j],$start_p) ;
}
//如果已经找到分页点,跳出循环
if($PageArray[$i]>0)
{
$j = $j + sizeof($Seperator) + 1;
}
}
for( $i = 1; $i < $PageCount-1; $i++ )
{
for( $j = 0 ; $j < sizeof($Seperator); $j++)
{
$Pos=strpos($content,$Seperator[$j],$PageArray[$i-1]+1900);
while($Pos > 0 && $Pos < ($i+1)*$PageLength && $Pos > $i*$PageLength )
{
$PageArray[$i] = $Pos ;
if ($Pos+$PageLength > $CLength)
{
$start_p2 = $CLength-1 ;
}
else{
$start_p2 = $Pos+$PageLength ;
}
$Pos = strpos($content,$Seperator[$j],$start_p2) ;
}
if($PageArray[$i]>0)
{
$j = $j + sizeof($Seperator) + 1;
}
}
}
//--PHP长文章分页函数最后一页
$PageArray[$PageCount-1] = $CLength;
//$page=2;
if($page==1)
{
$output=substr($content,0,$PageArray[$page-1]+2);
}
if($page > 1 && $page <= $PageCount)
{
$output=substr($content,$PageArray[$page-2]+2,$PageArray[$page-1]-$PageArray[$page-2]);
$output=" (上接第".($page-1)."页)n".$output;
}
// echo str_replace("n","<br > ",$output); //回车换行,根据需要调整
echo $output ;
if($PageCount > 1)
{
echo "<br ><center>";
echo "<font color='ff0000'>".$page."</font>/".$PageCount."页 ";
if($page>1)
echo "<a href=$PHP_SELF?expert_id=$expert_id&page_t=".($page-1).">上一页</a> ";
else
echo "上一页 ";
for( $i=1 ; $i <= $PageCount ; $i++)
{
echo "<a href=$PHP_SELF?expert_id=$expert_id&page_t=".$i.">[".$i."]</a> ";
}
if($page < $PageCount)
echo " <a href=$PHP_SELF?expert_id=$expert_id&page_t=".($page+1).">下一页</a> ";
else
echo " 下一页 ";
echo "</center>";
}
}
}
?>
|
办法二、通过分页符进行分页
通过分页符进行分页比起第一种办法要更为理想。
大致思想:在编辑文章内容时往内容里面插入分页符(如:<hr>),在文章显示时对文章内容进行分割,每一部分表示一个页的内容,通过传递参数控制显示第几页。
这种办法比较人性化,毕竟通过人工控制出来的分页截取的内容更符全我们的思维,而且可以一定程度上避免HTML标签不闭合的情形。
文章内容分页代码,是根据由编辑器插入的分页符来操作了,我们可以分出超漂亮的偏移效果的分页。
代码如下 |
复制代码 |
class contentpage
{
private $content; //文章内容
private $pagesize; //每页最少字节数
private $breakflag; //分页符(可以自定义,默认为n)
private $pageurl; //url地址
private $pagevar; //分页参数
public $pagecount; //总页数
public $page; //当前页码
public $pagebreak; //每页起始位置
function __construct($content = "",$pagesize = 10,$breakflag ="n",$pageurl = '',$pagevar = 'p')
{
$this->content = $content;
$this->pagesize = $pagesize;
$this->breakflag = $breakflag;
$this->pageurl = $pageurl;
$this->pagevar = $pagevar;
$this->getpages();
}
//总页数,每页的起始位置和结束位置
public function getpages()
{
$contentlen = strlen($this->content); //文章总字节数
$this->pagebreak[0] = 0;
$i = 0;
$offset = $this->pagesize;
for ($k=0;$k<$contentlen/$this->pagesize;$k++)
{
if($offset > $contentlen)
{
$i++;
$this->pagebreak[$i] = $contentlen;
break;
}
//查找$this->pagevar出现的位置
$where = strpos($this->content,$this->breakflag,$offset);
if($where > $contentlen or intval($where) < 1)
{
$i++;
$this->pagebreak[$i] = $contentlen;
break;
}
else
{
$i++;
$this->pagebreak[$i] = $where;
$offset = $where + $this->pagesize;
}
}
$this->pagecount = $i;
if(isset($_get[$this->pagevar]) && $_get[$this->pagevar] >1 && $_get[$this->pagevar] <= $this->pagecount)
{
$this->page = $_get[$this->pagevar];
}
else
{
$this->page = 1;
}
}
//每页内容
function getpage()
{
//截取当前页码的数据
if($this->page > 1)
{
return substr($this->content,$this->pagebreak[$this->page-1]+1,$this->pagebreak[$this->page] - $this->pagebreak[$this->page-1]);
}
else
{
return substr($this->content,$this->pagebreak[$this->page-1],$this->pagebreak[$this->page] - $this->pagebreak[$this->page-1]);
}
}
//分页条
public function getpagenav()
{
if($this->page > 1)
{
$pagenav = "<a href='".$this->geturl()."=".($this->page-1)."' class='div'>上一页</a> ";
}
//输出数字页码
for($j=1;$j<=$this->pagecount;$j++)
{
if($j == $this->page)
{
$pagenav .= "<span class='divsi'>".$j."</span> ";
}
else
{
$pagenav .= "<a href='".$this->geturl()."=".$j."' class='div'>".$j."</a> ";
}
}
//下一页
if($this->page < $this->pagecount && $this->pagecount >1)
{
$pagenav .= "<a href='".$this->geturl()."=".($this->page+1)."' class='div'>下一页</a> ";
}
return $pagenav;
}
//获取url地址
public function geturl()
{
$url = $_server['request_uri'];
$parse_url = parse_url($url);
$query_url = $parse_url['query'];
if($query_url)
{
$query_url = ereg_replace("(^|&)".$this->pagevar."=".$this->page,"",$query_url);
$url = str_replace($parse_url['query'],$query_url,$url);
if($query_url)
{
$url .= "&".$this->pagevar;
}
else
{
$url .= $this->pagevar;
}
}
else
{
$url .= "?".$this->pagevar;
}
return $url;
}
}
$content = "第一页:文章内容分页阿斯顿浪费空间阿斯顿来看福建省地方吉林省福建路口附近大手拉飞机上浪费的说浪费监理费
第二页:阿斯顿房间阿双方了解啊对萨拉开发记得谁来付款将令对方空间的来福建阿里是否
第三页:欧文炯诶哦生地拉开方面来看就继续超文章内容分页滤机蓝卡
第四页:欧文日据拉萨及发动四分啊就双方的将爱是发觉是文章内容分页否了。";
$model = new contentpage($content);
echo $model->getpage(); //输出分页内容
echo $model->getpagenav(); //输出页码
?>
<style type="text/css教程">
<!--
body {
width:800px;
margin:0 auto;
margin-top:50px;
font-size:12px;
}
a {
color:#014ccc;
text-decoration:none;
}
.div {
float:left;
cursor:pointer;
font-weight:bold;
margin-right:5px;
display: block;
padding:3px 7px;
text-align:center;
border:#bbdded solid 1px;
}
.divs {
float:left;
font-weight:bold;
margin-right:5px;
display: block;
padding:3px 7px;
text-align:center;
border:#cccccc solid 1px;
}
.divsi {
float:left;
font-weight:bold;
margin-right:5px;
display: block;
padding:3px 7px;
text-align:center;
background:#3399ff;
color:#ffffff;
border:#cccccc solid 1px;
}
.div:hover {
background:#3399ff;
color:#ffffff;
}
.divsi:hover {
background:#3399ff;
color:#ffffff;
}
-->
</style>
|
更多详细内容请查看:http://www.111cn.net/phper/php-gj/35233.htm
我们经常会在网站中看到可以直接把网站以快捷方式保存到自己的电脑中,然后只要点击就可以实现进入网了,那么php中怎么把网页添加到桌面快捷方式呢。
功能简单,直接上代码。
代码如下 |
复制代码 |
<a href='shortcuts.php'>火星时代IT开发</a>
|
shortcuts.php 代码
代码如下 |
复制代码 |
$Shortcut = "
[InternetShortcut]
URL=http://www.111cn.net
IDList=IconFile=http://www.111cn.net/favicon.ico
Prop3=19,2";
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename=111cn.url");
echo $Shortcut;
|
下面还提供一种方法
代码如下 |
复制代码 |
<?php
$Shortcut = "[InternetShortcut]
URL=http://www.111cn.net/
IDList=
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
";
Header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=11cn.url;");
echo $Shortcut;
?>
|
很早的时候,用php生成execl都是件麻烦的事,我一般都会用csv来替代,现在这类工具就很多了,并且比较成熟了。不光有excel的,word,pdf。
1,php excelreader操作excel的php类,生成,读取excel等。功能很强大。
下载地址:http://sourceforge.net/projects/phpexcelreader/
解压后,里面有很多例子,调用方法简单。
例1
代码如下 |
复制代码 |
<?php
/**
*
* @copyright 2007-2012 Xiaoqiang.
* @author Xiaoqiang.Wu <jamblues@gmail.com>
* @version 1.01
*/
error_reporting(E_ALL);
date_default_timezone_set('Asia/ShangHai');
/** PHPExcel_IOFactory */
require_once '../Classes/PHPExcel/IOFactory.php';
// Check prerequisites
if (!file_exists("31excel5.xls")) {
exit("not found 31excel5.xls.n");
}
$reader = PHPExcel_IOFactory::createReader('Excel5'); //设置以Excel5格式(Excel97-2003工作簿)
$PHPExcel = $reader->load("31excel5.xls"); // 载入excel文件
$sheet = $PHPExcel->getSheet(0); // 读取第一??工作表
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumm = $sheet->getHighestColumn(); // 取得总列数
$highestColumm= PHPExcel_Cell::columnIndexFromString($colsNum); //字母列转换为数字列 如:AA变为27
/** 循环读取每个单元格的数据 */
for ($row = 1; $row <= $highestRow; $row++){//行数是以第1行开始
for ($column = 0; $column < $highestColumm; $column++) {//列数是以第0列开始
$columnName = PHPExcel_Cell::stringFromColumnIndex($column);
echo $columnName.$row.":".$sheet->getCellByColumnAndRow($column, $row)->getValue()."<br />";
}
}
?>
|
例2
代码如下 |
复制代码 |
<?php
/**
*
* @copyright 2007-2012 Xiaoqiang.
* @author Xiaoqiang.Wu <jamblues@gmail.com>
* @version 1.01
*/
error_reporting(E_ALL);
date_default_timezone_set('Asia/ShangHai');
/** PHPExcel_IOFactory */
require_once '../Classes/PHPExcel/IOFactory.php';
// Check prerequisites
if (!file_exists("31excel5.xls")) {
exit("not found 31excel5.xls.n");
}
$reader = PHPExcel_IOFactory::createReader('Excel5'); //设置以Excel5格式(Excel97-2003工作簿)
$PHPExcel = $reader->load("31excel5.xls"); // 载入excel文件
$sheet = $PHPExcel->getSheet(0); // 读取第一??工作表
$highestRow = $sheet->getHighestRow(); // 取得总行数
$highestColumm = $sheet->getHighestColumn(); // 取得总列数
/** 循环读取每个单元格的数据 */
for ($row = 1; $row <= $highestRow; $row++){//行数是以第1行开始
for ($column = 'A'; $column <= $highestColumm; $column++) {//列数是以A列开始
$dataset[] = $sheet->getCell($column.$row)->getValue();
echo $column.$row.":".$sheet->getCell($column.$row)->getValue()."<br />";
}
}
?>
|
2,phpdocx操作word的php类
PHPDocx是一个用于生成完全动态的、完全兼容的Word文档的PHP类库。
你可能需要直接从任何数据集合或者表格文件来生成报表。这些报表也许会包括图标、图片、表格、开头、结束等等数据。
PHPDocx能够使用一些预定义的模板文件来生成Word文档,这大大简化了工作量。使用很少的一些代码,你能够将PHPDocx集成到你的WEB站点或网络应用,这样能够为你的用户或雇员提供一个很有价值的服务。
例
代码如下 |
复制代码 |
Basic example
// Include the PHPWord.php, all other classes were loaded by an autoloader
require_once 'PHPWord.php';
// Create a new PHPWord Object
$PHPWord = new PHPWord();
// Every element you want to append to the word document is placed in a section. So you need a section:
$section = $PHPWord->createSection();
// After creating a section, you can append elements:
$section->addText('Hello world!');
// You can directly style your text by giving the addText function an array:
$section->addText('Hello world! I am formatted.', array('name'=>'Tahoma', 'size'=>16, 'bold'=>true));
// If you often need the same style again you can create a user defined style to the word document
// and give the addText function the name of the style:
$PHPWord->addFontStyle('myOwnStyle', array('name'=>'Verdana', 'size'=>14, 'color'=>'1B2232'));
$section->addText('Hello world! I am formatted by a user defined style', 'myOwnStyle');
// You can also putthe appended element to local object an call functions like this:
$myTextElement = $section->addText('Hello World!');
$myTextElement->setBold();
$myTextElement->setName('Verdana');
$myTextElement->setSize(22);
// At least write the document to webspace:
$objWriter = PHPWord_IOFactory::createWriter($PHPWord, 'Word2007');
$objWriter->save('helloWorld.docx');
|
下载地址:http://www.phpdocx.com/
在线演示地址:http://www.phpdocx.com/demo/sample-word-report
3,tcpdf操作pdf的php类
下载地址:http://sourceforge.net/projects/html2fpdf/?source=recommended
在线演示地址:http://www.tcpdf.org/examples.php
下载后,基本上都是有例子的,下载后的东西比较大,这是因为,里面有很多例子,供例子用的pdf,word文件这类,也有很多字体文件。要用的类文件其实并不大的。记录一下用的时候,就不用到处找了。哈哈。
TCPDF自带的65个examples之后,就能完全掌握它的使用方法了。
大体可以分为如下5个步骤:
1. require_once导入tcpdf.php文件和config/lang/目录的相应语系
2. 实例化TCPDF
3. 设置PDF文档的格式,包括文档信息、页眉、页尾、字体、外间距、图片边框、分页等
4. 导入PDF文档的内容,可以是单行或多行简单字符串,也可以HTML格式的字符串等
5. 输出PDF文档
__autoload() 是PHP执行环境中约定的一个函数而非某个类的方法,如果一个类在使用之前没有加载到当前文件,会自动调用 __autoload() 函数来加载该类,通常这些类的加载规则都是约定的,比如这些类包含在以类名命名的文件内,该方法可以实现类的按需加载,避免脚本执行前加载不必要的类从而降低资源占用、提交性能。
注意:__autoload() 内的错误不能被 try-catch 捕获。
代码如下 |
复制代码 |
function __autoload($class_name){
require_once(PATH.'/calsses/'.$class_name.'.php');
}
$obj1 = new mycalss1();
|
注册 __autoload() 自动调用的函数:
spl 代码库在 PHP5.0 之后默认自动启用
spl_autoload_register([callback]); //不将具体实现的加载代码写在 __autoload() 内,可使用该函数注册回调函数。
如果使用类的方法作为回调函数需要传入一个数组:
代码如下 |
复制代码 |
spl_autoload_register(array('class_name'|$obj,'method_name'));
例如:
spl_autoload_register(array($this,'autoloadClass'));
|
spl_autoload_register(array('YiiBase','autoload'));// YII 框架的自动加载类的实现, YiiBase 类实现了一个autoload 方法。 spl_autoload_register() 可以注册多个加载函数,成功加载类文件之前将逐个尝试所有注册的加载函数。这在不同的类使用不同逻辑来导入类文件的时候很有用。
spl_autoload_unregister(); //取消某个注册的加载函数,参数与 spl_autoload_register() 相同.
spl_autoload_functions();// 以数组形式返回所有注册的 __autoload() 函数
spl_autoload(class_name[,file_extentions]); // __autoload() 函数的默认实现。 spl_autoload_register() 被调用时如果没有传入 函数名,则默认使用该函数,该函数的执行规则是: 类名转为小写作为文件名,传入的 file_extentions(多个扩展名以逗号隔开,默认为 .inc 和 .php)为扩展名,根据得到的文件名尝试在 php.ini 内设置的 include paths 中搜索。
spl_autoload_call(class_name);//手动调用所有注册的 __autoload() 函数来主动加载类文件
spl_autoload_extentions([file_extentions]); //注册或返回 spl_autoload() 中可以使用的文件扩展名,扩展名可以是 .a.b 这样的形式,例如:
代码如下 |
复制代码 |
spl_autoload_extentions(".class.php");
spl_autoload_register(); //使用spl_autoload() 来尝试自动加载类文件
//这样 spl_autoload('myclassName'); 会尝试加载 文件 "myclassName.class.php" .
|
实例
1、将需要注册的类放在一个数组中
代码如下 |
复制代码 |
<?php
final class Utils {
private function __construct() {
}
public static function getClasses($pre_path = '/') {
$classes = array(
'DBConfig' => $pre_path.'DBConfig/DBConfig.php',
'User' => $pre_path.'Model/User.php',
'Dao' => $pre_path.'Dao/Dao.php',
'UserDao' => $pre_path.'Dao/UserDao.php',
'UserMapper' => $pre_path.'Mapping/UserMapper.php',
);
return $classes;
}
}
?>
|
2、注册数组
注意:步骤1中的类的路径都是相对于init.php而言的,不是相对于Utils而言的,这是因为我们通过init.php里的自动加载函数spl_autoload_register来require类的
代码如下 |
复制代码 |
<?php
require_once '/Utils/Utils.php';
final class Init {
/**
* System config.
*/
public function init() {
// error reporting - all errors for development (ensure you have
// display_errors = On in your php.ini file)
error_reporting ( E_ALL | E_STRICT );
mb_internal_encoding ( 'UTF-8' );
//registe classes
spl_autoload_register ( array ($this,'loadClass' ) );
}
/**
* Class loader.
*/
public function loadClass($name) {
$classes = Utils::getClasses ();
if (! array_key_exists ( $name, $classes )) {
die ( 'Class "' . $name . '" not found.' );
}
require_once $classes [$name];
}
}
$init = new Init ();
$init->init ();
?>
|
3、本例中在使用处test.php里require init.php
代码如下 |
复制代码 |
<?php
require_once 'Init.php';
$dao = new UserDao();
$result = $dao->findByName('zcl');
?>
|
一个网友写的地市联动的php分类程序,大家可参考参考。
写一个函数,将数据
代码如下 |
复制代码 |
$array = array(
0=>array("","河北"),
1=>array("","北京"),
2=>array(0,"保定"),
3=>array(1,"海淀"),
4=>array(3,"中关村"),
5=>array(2,"涿州")
); |
处理后返回如下:
河北
-保定
--涿州
北京
-海淀
--中关村
代码如下 |
复制代码 |
function typeArray($array){
$con = null;
foreach ($array as $k=>$v){
$na[$k] = is_numeric($v[0]) ? $na[$v[0]].$k."|" : $k."|";
}
asort($na);
foreach ($na as $k=>$v){
$s = substr_count($v,"|");
$con .= str_repeat("-",($s-1)).$array[$k][1]."n";
}
return $con;
}
|