文档章节

【PHP】常用代码片段篇

岑小白
 岑小白
发布于 2012/10/10 09:54
字数 1486
阅读 103
收藏 0

一、用PHP生成验证码

    验证码几乎是网站必备的一个部分,生成验证码无非就那么几个步骤,首先是获取一个随机字符串,然后创建一个布画,将生成的字符串写到布画上,我们还可以在布画上画线画点,可以用随机角度控制斜线的斜率和文字的斜率等,现在帖一短生成验证码的代码。效果还不错。

    效果图:

    代码块:

<?php
if(!isset($_SESSION)){ //判断session是否开启
session_start(); //开启就session
} 
$width=70; //布画宽度
$height=25; //布画高度
$length=4;//验证码长度
$code=getcode($length); //获取随机字符串
$_SESSION['verfyCode'] = $code; 
$img=imagecreate($width,$height);
$bgcolor=imagecolorallocate($img,240,240,240);
$rectangelcolor=imagecolorallocate($img,150,150,150);
imagerectangle($img,1,1,$width-1,$height-1,$rectangelcolor);//画边框
for($i=0;$i<$length;$i++){//循环写字
$codecolor=imagecolorallocate($img,mt_rand(50,200),mt_rand(50,128),mt_rand(50,200));
$angle=rand(-20,20);
$charx=$i*15+8;
$chary=($height+14)/2+rand(-1,1);
imagettftext($img,15,$angle,$charx,$chary,$codecolor,'C:\WINDOWS\Fonts\SIMKAI.TTF',
$code[$i]);
}
for($i=0;$i<20;$i++){//循环画线
$linecolor=imagecolorallocate($img,mt_rand(0,250),mt_rand(0,250),mt_rand(0,250));
$linex=mt_rand(1,$width-1);
$liney=mt_rand(1,$height-1);
imageline($img,$linex,$liney,$linex+mt_rand(0,4)-2,$liney+mt_rand(0,4)-2,$linecolor);
}
for($i=0;$i<100;$i++){//循环画点
$pointcolor=imagecolorallocate($img,mt_rand(0,250),mt_rand(0,250),mt_rand(0,250));
imagesetpixel($img,mt_rand(1,$width-1),mt_rand(1,$height-1),$pointcolor);
}
function getcode($length){//生成php随机数 
$pattern = '1234567890ABCDEFGHIJKLOMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ';//字符池 
for($i=0;$i<$length;$i++) { 
$key .= $pattern{mt_rand(0,35)}; 
} 
return $key; 
}
ob_clean();
header('Content-type:image/png'); 
imagepng($img);
?>

二、PHP 利用ord()截取 gbk2312、utf8、中英文混合字符串方法

注解:ord() 函数返回字符串第一个字符的 ASCII 值。

代码如下:

<?php 
$lenth = 19; 
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?"; 
echo strlen($str)<=$lenth ? $str : (substr($str,0,$lenth).chr(0)."...."); 
?>

但是在英文和汉字混合的情况下会出现如下问题: 

$str="这是一个字符串"; 

为了截取该串的前10个字符,使用 

if(strlen($str)>10) $str=substr($str,10)."…"; 

那么,echo $str的输出应该是"这是一个字…" 

假设 

$str="这是1个字符串"; 

这个串中包含了一个半角字符,同样执行: 

if(strlen($str)>10) $str=substr($str,10); 

由于原字符串$str的第10、11个字符构成了汉字“符”; 

执行串分割后会将该汉字一分为二,这样被截取的串就会发现乱码现象。 

解决方案:

<?php 
//村里有很多,这个是gb2312 
function substrs($content,$length='30') 
{ 
    if($length && strlen($content)>$length) 
    { 
        $num=0; 
        for($i=0;$i<$length-3;$i++) 
        { 
            if(ord($content[$i])>127) 
            { 
                $num++; 
            } 
        } 
        $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3); 
    } 
    return $content; 
} 
function cutstr($string, $length, $dot = ' ...') { 
    $strcut = ''; 
    for($i = 0; $i < $length - strlen($dot) - 1; $i++) { 
        $strcut .= ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i]; 
    } 
    return $strcut.$dot; 
}  
function cutTitle($str, $len, $tail = ""){ 
    $length = strlen($str); 
    $lentail = strlen($tail); 
    $result = ""; 
    if($length > $len){ 
        $len = $len - $lentail; 
        for($i = 0;$i < $len;$i ++){ 
            if(ord($str[$i]) < 127){ 
                $result .= $str[$i]; 
            }else{ 
                $result .= $str[$i]; 
                ++ $i; 
                $result .= $str[$i]; 
            } 
        } 
        $result = strlen($result) > $len ? substr($result, 0, -2) . $tail : $result . $tail; 
    }else{ 
        $result = $str; 
    } 
    return $result; 
}
?>

1. 截取GB2312中文字符串

/* 
@ 另一种方法,使用ord()函数: 
@ 适用于 gb2312 编码: 
*/ 
$str = "怎么将新闻的很长的标题只显示前面一些字,后面用.....来代替?"; 
function gb2312_substr($str, $limit) { 
    $restr =''; 
    for($i=0;$i< $limit-3;$i++) { 
        $restr .= ord($str[$i])>127 ? $str[$i].$str[++$i] : $str[$i]; 
    } 
    return $restr; 
}

2. 截取utf8编码的多字节字符串

/* 
@ 以下仅适用于 utf-8 编码; 
*/ 
function utf8_substr($str, $limit) { 
    $restr = ''; 
    for($i=0;$i< $limit-3;$i++) { 
        $restr .= ord($str[$i])>127 ? $str[$i].$str[++$i].$str[++$i] : $str[$i]; 
    } 
    return $restr; 
}

//解释下上面第一个:chr(0)不是null,null是什么都没有,而chr(0)的值是0。表示成16进制是0x00,表示成二进制是00000000虽然chr(0)不会显示出什么,但是他是一个字符。虽然chr(0)不会显示出什么,但是他是一个字符。当汉字被截断时,根据编码规则他总是要把后边的其他字符拉过来一起作为汉字解释,这就是出现乱码的原因。 

3、UTF-8、GB2312都支持的汉字截取函数

<?php 
/* 
Utf-8、gb2312都支持的汉字截取函数 
cut_str(字符串, 截取长度, 开始长度, 编码); 
编码默认为 utf-8 
开始长度默认为 0 
*/function cut_str($string, $sublen, $start = 0, $code = 'UTF-8') 
{ 
    if($code == 'UTF-8') 
    { 
        $pa ="/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-\xbf][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/"; 
        preg_match_all($pa, $string, $t_string); if(count($t_string[0]) - $start > $sublen) return join('', array_slice($t_string[0], $start, $sublen))."..."; 
        return join('', array_slice($t_string[0], $start, $sublen)); 
    } 
    else 
    { 
        $start = $start*2; 
        $sublen = $sublen*2; 
        $strlen = strlen($string); 
        $tmpstr = ''; 
        for($i=0; $i<$strlen; $i++) 
        { 
            if($i>=$start && $i<($start+$sublen)) 
            { 
                if(ord(substr($string, $i, 1))>129) 
                { 
                    $tmpstr.= substr($string, $i, 2); 
                } 
                else 
                { 
                    $tmpstr.= substr($string, $i, 1); 
                } 
            } 
            if(ord(substr($string, $i, 1))>129) $i++; 
        } 
        if(strlen($tmpstr)<$strlen ) $tmpstr.= "..."; 
        return $tmpstr; 
    } 
}
    $str = "abcd需要截取的字符串"; 
    echo cut_str($str, 8, 0, 'gb2312'); 
?>

4. BugFree 的字符截取函数

<?php 
/** 
* @package BugFree 
* 
* 
* Return part of a string(Enhance the function substr()) 
* 
* @author Chunsheng Wang 
* @param string $String the string to cut. 
* @param int $Length the length of returned string. 
* @param booble $Append whether append "...": false|true 
* @return string the cutted string. 
*/ 
function sysSubStr($String,$Length,$Append = false) 
{ 
    if (strlen($String) <= $Length ) 
    { 
        return $String; 
    } else { 
        $I = 0; 
        while ($I < $Length) 
        { 
            $StringTMP = substr($String,$I,1); 
            if ( ord($StringTMP) >=224 ) 
            { 
                $StringTMP = substr($String,$I,3); 
                $I = $I + 3; 
            } elseif( ord($StringTMP) >=192 ) { 
                $StringTMP = substr($String,$I,2); 
                $I = $I + 2; 
            } else { 
                $I = $I + 1; 
            } 
            $StringLast[] = $StringTMP; 
        } 
        $StringLast = implode("",$StringLast); 
        if($Append) { 
            $StringLast .= "..."; 
        } 
        return $StringLast; 
    } 
}
/* Test */
$String = "www.baidu.com"; 
$Length = "18"; 
$Append = false; 
echo sysSubStr($String,$Length,$Append); 
?>


三、将HTML转换为纯文本

有时候可能需要将HTML文本转换为纯文本。可以使用strip_tags()函数达到这个目的,该函数删除字符串中的所有HTML和PHP标记,只剩下文本实体。其形式为:

string strip_tags(string str[,string allowable_tags])

可选的参数allowable_tags指定在此过程中可以跳过的标记。下面的例子使用了strip_tags()删除字符串中的所有HTML标记:

$input = "Email <a href="example@example.com">example@example.com</a>";
echo strip_tags($input);

返回以下结果:

Email example@example.com

下面的例子删除<a>标记之外的所有标记:      

$input  = "This <a href="  is <strong >yanshare  </strong>!  ";
echo strip_tags($input, "<a>");

返回结果如下:

This  <a href="http://www.example.com/">example</a> is yanshare  !




© 著作权归作者所有

共有 人打赏支持
岑小白

岑小白

粉丝 133
博文 187
码字总数 300648
作品 0
杭州
其他
私信 提问
史上最简单的 GitHub 教程

温馨提示:本系列博文已经同步到 GitHub,如有需要的话,欢迎大家到「github-tutorial」进行和操作! 1 简介   GitHub 是一个面向开源及私有软件项目的托管平台,因为只支持 Git 作为唯一的...

qq_35246620
2017/03/27
0
0
[Qt和GLSL的笔记3] GLSL基本知识和两个小例子

时间:2017年4月21日 作者:RyuZhihao123 (northwest A&F University) 写在前面: 这一部分可能相对乏味。主要是我整理的关于GLSL的基本知识。 Qt和GLSL开发3 - GLSL基本知识 一、关于固定管...

Mahabharata_
2017/04/21
0
0
Spring Boot总结(9)---Thymeleaf用法大全

到这篇,基本上Spring Boot框架的各种常用功能都已经总结介绍完了。用过Spring Boot开发过项目之后,我觉得最常用和最需要总结的是两个东西,Spring Data JPA 和 Thymeleaf 语法,因为你了解...

weberweber
2017/10/12
0
0
阿里云众包 - ODPS PHP SDK【PHP】

[背景] ODPS 是阿里云的大数据平台,需要实现PHP SDK 关于赏金的分配方案: 赏金只会发放选择最合适的一个方案。如果组队的方案为最佳,为了保证组队的人在获取奖金方面的安全性,我们会通过...

阿里开源
2015/12/22
30
6
PHP的if性能问题求教

【PHP】求教针对于单个HTML页面内多个IF 和 是否有性能差异?

许添翼
2015/07/03
223
4

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部