PHP实现的一分页工具类代码

 更新时间:2016年11月25日 17:26  点击:1504
之前想过一种方法,也就是看情况去一点点的判断,不过很纠结,思想很乱,虽然也成功的做到了一些效果,但不完美,之后就换了一种思维方式:把要想显示的总页数(1 … 4 5 6 7 8 9 … 20)中间的看成一个可以滑动的固定长度的尺子

总的页数是一个长度一定的木块,这把尺子在这个木块上滑动,前提,尺子的两端不能超出木块:D。发现这么一来要做的事情就是去找这个尺子在木块上的起始点,根据用户给传进来的page变量。哈哈,关键代码下面:

 代码如下 复制代码

    /**
    * 把中间的看成一个可以滑动的固定长度的尺子
    *
    * 把$this->_totalShowPages 当成一个可以滑动的固定长度尺子,
    * 然后$this->_totalPages就是一个给定长度的木块,尺子在这个
    * 木块上滑动。情况两种:
    * 1. 尺子长度大于木块长度,那么就直接输出所有的页码;
    * 2. 尺子长度小于木块长度,那么就只用找到输出这个尺子长度页
    * 数的起始点——$start, $end;
    *
    * @Access protected
    * @Return void
    * @Exception none
    */
    protected function _getShowPageNumber()
    {
    $pageHtml = '';
    //找到$start点
    if($this->_curPage - 2 > 1) {
    $start = $this->_curPage - 2;
    } else {
    $start = 1;
    }
    //找到$end 点
    $end = $start + $this->_totalShowPages;
    if($end >= $this->_totalPages) {
    $end = $this->_totalPages;
    $start = $end - $this->_totalShowPages; //保证页面显示的长度为$this->_totalShowPages
    }
    if($start != 1) {
    $pageHtml .= $this->_getPageHtml(1);
    $preMore = $this->_curPage - $this->_totalShowPages;
    if($preMore < 1) {
    $preMore = 1;
    }
    $pageHtml .= $this->_getMorePageHtml($preMore);
    }
    for($page = $start; $page < $end; $page ++) {
    $pageHtml .= $this->_getPageHtml($page);
    }
    if($end != $this->_totalPages) {
    $pageHtml .= $this->_getMorePageHtml($end);
    }
    $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
    
    return $pageHtml;
    }

第一种老想法的代码实现:

 代码如下 复制代码

    /**
    * 一步步的来
    *
    * @desc
    *
    * @Access protected
    * @Return void
    * @Exception none
    */
    protected function _getShowPageNumberTwo()
    {
    if($this->_curPage < $this->_totalShowPages) {
    for($page = 1; $page < $this->_totalShowPages; $page ++) {
    $pageHtml .= $this->_getPageHtml($page);
    }
    $pageHtml .= $this->_getMorePageHtml($this->_totalShowPages);
    $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
    } else {
    $pageHtml .= $this->_getNormalPageHtml(1);
    if($this->_curPage == $this->_totalShowPages) {
    $pageHtml .= $this->_getMorePageHtml(1);
    } else {
    $pageHtml .= $this->_getMorePageHtml($this->_curPage - $this->_totalShowPages);
    }
    if($this->_curPage + $this->_totalShowPages >= $this->_totalPages) {
    for($page = $this->_totalPages - $this->_totalShowPages; $page < = $this->_totalPages; $page ++) {
    $pageHtml .= $this->_getPageHtml($page);
    }
    } else {
    $start = $this->_curPage - 2;
    $end = $this->_curPage + $this->_totalShowPages - 2;
    for($page = $start; $page < $end; $page ++) {
    $pageHtml .= $this->_getPageHtml($page);
    }
    $pageHtml .= $this->_getMorePageHtml($this->_curPage + $this->_totalShowPages - 2);
    $pageHtml .= $this->_getNormalPageHtml($this->_totalPages);
    }
    }
    
    return $pageHtml;
    }

示例图:



类文件下载:HPage.php (等我这个小类库完成了再一起放上 :D)。

文章截断使用主要是在列表页面时我没有写描述这样只能在文章中截取字符串了,但使用php 自带函数会导致div未结束,从而页面混乱了,那么要如何解决此问题呢?

博主写好一篇文章,博客后台一般会在搜索页面或者列表页面给出文章标题和截断了的的文章部分作为进一步阅读的入口。

Function: mb_substr( $str, $start, $length, $encoding )

$str,需要截断的字符串
$start,截断开始处
$length,长度(注意,这个跟mb_strimwidth不同,1就代表一个中文字符)
$encoding,编码,我设为 utf-8

例:截断文章标题,控制在15个文字

 代码如下 复制代码

<?php echo mb_substr('www.111cn.net原创', 0, 15,"utf-8"); ?>

这样对于纯文本没问题,但是我的是中间有html标签的于是问题来了。怎样截断一篇文章。注意,这篇文章不仅仅是普通的字符串文本,而是包含了各种格式化标签和样式内容的文本。如果处理不当,这些闭合标签无法正常关闭,从而破坏整个文档流。

如果单纯是纯文本,下面这个函数差不多是够用的。

  

 代码如下 复制代码
  <?php
    /**
     * 字符串截取,支持中文和其他编码
     *
     * @param string $str 需要转换的字符串
     * @param string $start 开始位置
     * @param string $length 截取长度
     * @param string $charset 编码格式
     * @param string $suffix 截断字符串后缀
     * @return string
     */
    function substr_ext($str, $start=0, $length, $charset="utf-8", $suffix="")
    {
        if(function_exists("mb_substr")){
             return mb_substr($str, $start, $length, $charset).$suffix;
    }
        elseif(function_exists('iconv_substr')){
             return iconv_substr($str,$start,$length,$charset).$suffix;
        }
        $re['utf-8']  = "/[x01-x7f]|[xc2-xdf][x80-xbf]|[xe0-xef][x80-xbf]{2}|[xf0-xff][x80-xbf]{3}/";
        $re['gb2312'] = "/[x01-x7f]|[xb0-xf7][xa0-xfe]/";
        $re['gbk']    = "/[x01-x7f]|[x81-xfe][x40-xfe]/";
        $re['big5']   = "/[x01-x7f]|[x81-xfe]([x40-x7e]|xa1-xfe])/";
        preg_match_all($re[$charset], $str, $match);
        $slice = join("",array_slice($match[0], $start, $length));
        return $slice.$suffix;
    }


但是,如果需要截断是网页中的某部分格式化文本,上面的函数就不够用了。它不具备处理格式化标签的能力。


这时,需要一个新函数,它应该是以上函数的升级加强版,它必须有能力正确的处理标签,下面找到一个

strip_tags() 函数剥去 HTML、XML 以及 PHP 的标签。

例子 1

 代码如下 复制代码

<?php
echo strip_tags("Hello <b>world!</b>");
?>

输出:

Hello world!

这样就好做了我们只要在上面基础上如下操作

 代码如下 复制代码

<?php
$a = strip_tags("Hello <b>world!</b>");
substr_ext( $a,10) ;

但是发现html不见了这个也不是什么好的解决办法了。
?>

接着google 发现cns写了一个支持html截取字符串的函数

 代码如下 复制代码

/**
 * 获取字符在字符串中第N次出现的位置
 * @param string $text 字符串
 * @param string $key 字符
 * @param int $int N
 * @return int
 */
function strpos_int($text, $key, $int)
{
    $keylen = strlen($key);
    global $textlen;
    if (!$textlen)
        $textlen = strlen($text);
    static $textpos = 0;
    $pos = strpos($text, $key);
    $int--;
    if ($pos)
    {
        if ($int == 0)
            $textpos+=$pos;
        else
            $textpos+=$pos + $keylen;
    }
    else
    {
        $int = 0;
        $textpos = $textlen;
    }
    if ($int > 0)
    {
        strpos_int(substr($text, $pos + $keylen), $key, $int);
    }
    return $textpos;
}

 

/**
 * 截取HTML
 * @param string $string  HTML 字符串
 * @param int $length 截取的长度
 * @param string $dot
 * @param string $append
 * @return string
 */
function cuthtml($string, $length, $dot = ' ...', $append = "")
{
    $str = strip_tags($string);//先过滤标签
    $new_str = iconv_substr($str, 0, $length, 'utf-8');
    $last = iconv_substr($new_str, -1, 1, 'utf-8');
    $sc = substr_count($new_str, $last);
    $position = strpos_int($string, $last, $sc); //获取截取真实的长度
    if (function_exists('tidy_parse_string'))//服务器开启tidy的话 直接用函数不全html代码即可
    {
        $options = array("show-body-only" => true);
        return tidy_parse_string(mb_substr($string, 0, $position) . $dot . $append, $options, 'UTF8');
    } else //没有开启tidy
    {
        if (strlen($string) <= $position)
        {
            return $string;
        }

        $pre = chr(1);
        $end = chr(1);
        $string = str_replace(array('&', '"', '<', '>'), array($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $end, $pre . '>' . $end), $string);

        $strcut = '';

        $n = $tn = $noc = 0;
        while ($n < strlen($string))
        {

            $t = ord($string[$n]);
            if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126))
            {
                $tn = 1;
                $n++;
                $noc++;
            } elseif (194 <= $t && $t <= 223)
            {
                $tn = 2;
                $n += 2;
                $noc += 2;
            } elseif (224 <= $t && $t <= 239)
            {
                $tn = 3;
                $n += 3;
                $noc += 2;
            } elseif (240 <= $t && $t <= 247)
            {
                $tn = 4;
                $n += 4;
                $noc += 2;
            } elseif (248 <= $t && $t <= 251)
            {
                $tn = 5;
                $n += 5;
                $noc += 2;
            } elseif ($t == 252 || $t == 253)
            {
                $tn = 6;
                $n += 6;
                $noc += 2;
            } else
            {
                $n++;
            }

            if ($noc >= $position)
            {
                break;
            }
        }
        if ($noc > $position)
        {
            $n -= $tn;
        }

        $strcut = substr($string, 0, $n);
        $strcut = str_replace(array($pre . '&' . $end, $pre . '"' . $end, $pre . '<' . $end, $pre . '>' . $end), array('&', '"', '<', '>'), $strcut);

        $pos = strrpos($strcut, chr(1));
        if ($pos !== false)
        {
            $strcut = substr($strcut, 0, $pos);
        }
        return $strcut . $dot . $append;
    }
}

以前碰到最多的是json_encode是gbk 编码时出现乱码,今天发现uft8也会出现中文乱码了,下面我们一起看问题如何解决吧。

utf-8字符json_encode为变成转成utf16编码,也就是介个样子:

 代码如下 复制代码

$ ./php/bin/php -r 'echo json_encode("中文");'
"u4e2du6587"

可读性降低,最新的php 5.4的json_encode支持了UTF-8编码,可以把中文不编码直接输出。
那低版本怎么办呢?也有办法,封装成一个函数给大家分享一下:

 代码如下 复制代码

function my_json_encode($var) {
    return preg_replace("/u([a-f0-9]{4})/e", "iconv('UCS-4LE','UTF-8',pack('V', hexdec('U$1')))", json_encode($var));
}

例,利用另一种办法来解决

后台PHP页面(页面编码为UTF-8或者已经把字符转为UTF-8)使用json_encode将PHP中的array数组转为JSON字符串。例如:

 代码如下 复制代码

<?php
  $testJSON=array('name'=>'中文字符串','value'=>'test');
  echo json_encode($testJSON);
?>

查看输出结果为:
{“name”:”u4e2du6587u5b57u7b26u4e32″,”value”:”test”}

可见即使用UTF8编码的字符,使用json_encode也出现了中文乱码。解决办法是在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode,输出结果的时候在用函数urldecode()转回来。具体如下:

 代码如下 复制代码

<?php
    $testJSON=array('name'=>'中文字符串','value'=>'www.111cn.net'');
    //echo json_encode($testJSON);
    foreach ( $testJSON as $key => $value ) {
  $testJSON[$key] = urlencode ( $value );
    }
    echo urldecode ( json_encode ( $testJSON ) );
?>

查看输出结果为:

{“name”:”中文字符串”,”value”:”www.111cn.net”}

到此,成功地输出了中文字符

下面我们一起来看和篇关于php bcd码压缩-把十进制数字压缩到十六进制数据中实例,希望文章给各位同学带来帮助哦。

例,php bcd码压缩-把十进制数字压缩到十六进制数据中

 代码如下 复制代码
<?php
/*
php bcd码压缩-把十进制数字压缩到十六进制数据中
例如 0091 压缩后 0x00 0x91
*/
$string = '0091';
$bytes = Bytes::getBytes($string);
print_r($bytes);
/*
Array
(
   
[0] => 48
   
[1] => 48
   
[2] => 57
   
[3] => 49
)
*/
$asc=Bytes::AscToHex($bytes,4);
//4位压缩成2位
print_r($asc);
/*
Array
(
   
[0] => 0
   
[1] => 145
)
*/
echo Bytes::toStr($asc);
/*
0091
*/
$hex=Bytes::HexToAsc($asc,2);
//反操作2位还原成4位
print_r($hex);
/*
Array
(
   
[0] => 48
   
[1] => 48
   
[2] => 57
   
[3] => 49
)
*/
?>

例,把十进制数字压缩到十六进制数据中

 代码如下 复制代码

<?php
/**
 
* php bcd码压缩
 
* 把十进制数字压缩到十六进制数据中
 
* @author phpff.com
 
* Created on 2011-7-15
 
*/
class Bytes {
   
/**
    
* 转换一个String字符串为byte数组
    
* @param $str 需要转换的字符串
    
* @param $bytes 目标byte数组
    
* @author phpff.com
    
*/
    public static function getBytes($string) {
 
        $bytes = array();
        for($i = 0; $i < strlen($string); $i++){
             $bytes[] = ord($string[$i]);
        }
        return $bytes;
    }
 
   
/**
    
* 将字节数组转化为String类型的数据
    
* @param $bytes 字节数组
    
* @param $str 目标字符串
    
* @return 一个String类型的数据
    
*/
 
    public static function toStr($bytes) {
        $str = '';
        foreach($bytes as $ch) {
            $str .= bin2hex(chr($ch));
        }
 
           return $str;
    }
 
   
/**
    
* asc码转成16进制数据
    
* @param $asc asc数字字符串
    
* @param $AscLen 需要转换的字符串长度
    
* @return 16进制数组
    
* @author  phpff.com
    
*/
     public static function AscToHex( $asc, $AscLen) {
        $i=0;
        $Hex=array();
        for($i = 0; 2*$i < $AscLen; $i++)
        {
           
/*A:0x41(0100 0001),a:0x61(0110 0001),右移4位后都是0001,加0x90等0xa*/
            $Hex[$i] =  (chr($asc[2*$i]) << 4);
            if (!(chr($asc[2*$i]) >= '0' && chr($asc[2*$i]) <= '9' )){
                $Hex[$i] +=  0x90;
            }
 
            if(2*$i+1 >= $AscLen){
                break;
            }
 
            $Hex[$i] |= (chr($asc[2*$i+1]) & 0x0f);
            if (!(chr($asc[2*$i+1]) >= '0' && chr($asc[2*$i+1]) <= '9' )){
                $Hex[$i] += 0x09;
            }
 
        }
        return $Hex;
    }
    
/**
    
* 将16进制的数据转换成asc码
    
* @param $Hex 16进制数组
    
* @param $HexLen 16进制数组长度
    
* @return asc数组
    
* @author  phpff.com
    
*/
    public static function HexToAsc($Hex, $HexLen) {
        $i=0;
        $Temp=0;
        for($i = 0; $i < $HexLen; $i++ )
        {
            $Temp = ($Hex[$i] & 0xf0) >> 4;
            if ($Temp < 10){
                $Asc[2*$i] =  (0x30 + $Temp);
            }else{
                $Asc[2*$i] =   (0x37 + $Temp);
            }
 
            $Temp = $Hex[$i] & 0x0f;
            if ($Temp < 10){
                $Asc[2*$i+1] = (0x30 + $Temp);
            }else{
                $Asc[2*$i+1] =  (0x37 + $Temp);
            }
 
        }
        return $Asc;
    }
 
}
?>

生成二维码是现在各大网站会看到一种功能了,下我们来看看利用phpqrcode库来快速生成二维码实例,希望文章对大家会有所帮助。

QR码详细原理可以参考QR维基百科,中文版介绍比较少,英文版介绍很全面,推荐看英文版的。

Description

PHP QR Code is open source (LGPL) library for generating QR Code, 2-dimensional barcode. Based on libqrencode C library, provides API for creating QR Code barcode images (PNG, JPEG thanks to GD2). Implemented purely in PHP.

Features
•Supports QR Code versions (size) 1-40
•Numeric, Alphanumeric, 8-bit and Kanji encoding.
•Implemented purely in PHP, no external dependencies except GD2
•Exports to PNG, JPEG images, also exports as bit-table
•TCPDF 2-D barcode API integration
•Easy to configure
•Data cache for calculation speed-up
•Debug data dump, error logging, time benchmarking
•Provided merge tool helps deploy library as a one file
•new! API documentation
•new! Over 30 detailed examples
•100% Open Source, LGPL Licensed
Demo


项目地址:http://sourceforge.net/projects/phpqrcode/

Generate fixed size images

* phpqrcode本身未提供固定大小二维码的设置,请参考 http://sourceforge.net/p/phpqrcode/discussion/1111884/thread/f739531a/

 

 代码如下 复制代码

--- original/phpqrcode/qrimage.php       2010-08-18 07:06:24.000000000 -0700
+++ qrimage.php 2012-07-13 00:51:57.000000000 -0700
@@ -86,10 +86,15 @@
                 }
             }
-            $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint);
-            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH);
+
+            $targetW = (defined('IMAGE_WIDTH') ? IMAGE_WIDTH : $imgW * $pixelPerPoint );
+            $targetH = (defined('IMAGE_HEIGHT') ? IMAGE_HEIGHT : $imgH * $pixelPerPoint );
+
+            $target_image =ImageCreate($targetW, $targetH);
+
+            ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $targetW, $targetH, $imgW, $imgH);
             ImageDestroy($base_image);
             return $target_image;
         }
-    }
No newline at end of file
+    }

用法,设置生成的二维码宽高为 500px

define('IMAGE_WIDTH', 500);
define('IMAGE_HEIGHT', 500);
QRcode::png('http://www.111cn.net/)');

[!--infotagslink--]

相关文章

  • php KindEditor文章内分页的实例方法

    我们这里介绍php与KindEditor编辑器使用时如何利用KindEditor编辑器的分页功能实现文章内容分页,KindEditor编辑器在我们点击分页时会插入代码,我们只要以它为分切符,就...2016-11-25
  • 自己动手写的jquery分页控件(非常简单实用)

    最近接了一个项目,其中有需求要用到jquery分页控件,上网也找到了需要分页控件,各种写法各种用法,都是很复杂,最终决定自己动手写一个jquery分页控件,全当是练练手了。写的不好,还请见谅,本分页控件在chrome测试过,其他的兼容性...2015-10-30
  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • jquery实现的伪分页效果代码

    本文实例讲述了jquery实现的伪分页效果代码。分享给大家供大家参考,具体如下:这里介绍的jquery伪分页效果,在火狐下表现完美,IE全系列下有些问题,引入了jQuery1.7.2插件,代码里有丰富的注释,相信对学习jQuery有不小的帮助,期...2015-10-30
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • vue.js 表格分页ajax 异步加载数据

    Vue.js通过简洁的API提供高效的数据绑定和灵活的组件系统.这篇文章主要介绍了vue.js 表格分页ajax 异步加载数据的相关资料,需要的朋友可以参考下...2016-10-20
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • php导出csv格式数据并将数字转换成文本的思路以及代码分享

    php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25