文档章节

【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
博文 178
码字总数 300412
作品 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
让你变懒的 Android Studio Live Templates

俗话说,不想偷懒的程序员不是好程序员!那么今天就教大家偷懒下! 先举个例子,我们在 Android 开发中输入 Toast ,然后会有如下如下的快速操作: 是不是很方便? 有同学问,这不就是自动补...

花仲马
2016/08/23
5.4K
19
前端周刊第 60 期:用空格缩进的程序员挣得更多?

David Robinson 从 Stack Overflow 年度开发者调查中发现的结论,使用空格缩进比使用制表符缩进的程序员平均年薪高 8.6%,即多超过两年的工作经验,当然这个结论是纯粹统计上的相关性,很难说...

王仕军
09/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

GO冒泡,二分查找

package mainimport("fmt")func main() {var arr [5]int = [5]int{11,13,9,2,25}maopao(&arr)fmt.Println("arr = ", arr) //[2 9 11 13 25]findIndex := binaryFind(&arr, 0......

汤汤圆圆
12分钟前
1
0
工作2年半跳槽面试阿里,成功拿到offer,凭什么?

2015年刚毕业的我,进入了一家小小的公司实习工作,在学校学了三年软件开发的我,还是想去寻找一份互联网行业的工作,这样更能学以致用发挥自己的特长。一直到18年三月份,我辞掉已有的工作,...

java知识分子
16分钟前
1
0
讲述下:Linux的10个最危险的命令

导读 Linux命令行佷有用、很高效,也很有趣,但有时候也很危险,尤其是在你不确定你自己在正在做什么时候。这篇文章将会向你介绍十条命令,但你最好不要尝试着去使用。 当然,以下命令通常都...

问题终结者
20分钟前
1
0
分库分表后如何部署上线?

引言 我们先来讲一个段子 面试官:“有并发的经验没?” 应聘者:“有一点。” 面试官:“那你们为了处理并发,做了哪些优化?” 应聘者:“前后端分离啊,限流啊,分库分表啊。。” 面试官:...

Java烂猪皮
25分钟前
1
0
Redis源码阅读笔记-快速列表

快速列表 快速列表(quicklist)是由压缩列表(ziplist)组成的一个双向链表,链表中,每一个节点都是以压缩列表(ziplist)的结构保存。 在 Redis3.2 后加入的新数据结构,在列表键中取代了双向链...

Jian_Ming
43分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部