文档章节

【PHP】常用代码片段篇

呢喃的猫咪
 呢喃的猫咪
发布于 2012/10/10 09:54
字数 1486
阅读 103
收藏 0
点赞 0
评论 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
Spring Boot总结(9)---Thymeleaf用法大全

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

weberweber
2017/10/12
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
能让你开发效率翻倍的 VSCode 插件配置(上)

工欲善其事必先利其器,软件工程师每天打交道最多的可能就是编辑器了。入行几年来,先后折腾过的编辑器有 EditPlus、UltraEdit、Visual Studio、EClipse、WebStorm、Vim、SublimeText、Atom、...

王仕军
2017/11/13
0
0
让你变懒的 Android Studio Live Templates

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

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

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

王仕军
2017/06/20
0
0
PHP的if性能问题求教

【PHP】求教针对于单个HTML页面内多个IF if(i==1){ }else{ } 和 if(i==1): else: endif; 是否有性能差异?

许添翼
2015/07/03
220
4
提高iOS开发效率的方法和工具

介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具。 IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这...

袁俊晓晓
2015/08/17
0
0
11步提高代码质量和整体工作效率

11步提高代码质量和整体工作效率 发布时间:2012-12-28 13:09:00 来源: 评论:0 点击: 次 【字号:大 中 小】 QQ空间新浪微博腾讯微博人人网豆瓣网百度空间百度搜藏开心网复制更多21 这篇文...

thinkyoung
2015/09/29
0
0
常用python日期、日志、获取内容循环的代码片段

近段时间对shell脚本和python进行了梳理,将一些脚本中常用的内容,考虑多种方法整理出来,形成有用的代码片段,这样就可以在需要的时候直接使用,也可以用于备忘和思考。 本次整理的代码片段...

yumushui991
2017/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
4分钟前
0
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
9分钟前
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
47分钟前
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
58分钟前
2
0
将博客搬至CSDN

AHUSKY
今天
1
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
7
0
Python PIPEs

https://www.python-course.eu/pipes.php https://www.tutorialspoint.com/python/os_pipe.htm

zungyiu
今天
1
0
gRPC学习笔记

gRPC编程流程 1. proto文件定义 proto文件用于定义需要通过gRPC生成的接口,可以理解为接口定义文档 2. 通过构建工具生成服务基类代码-Maven或Gradle 3. 服务端开发 服务端实现类须实现通过构...

OSC_fly
今天
0
0
Docker Mac (三) Dockerfile 及命令

Dockerfile 最近学习docker的时候,遇到一件怪事,关于docker镜像可能会被破坏,还不知道它会有此措施 所以需要了解构建Dockerfile的正确方法 Dockerfile是由一系列命令和参数构成的脚本,这些命...

___大侠
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部