【PHP】常用代码片段篇
【PHP】常用代码片段篇
呢喃的猫咪 发表于5年前
【PHP】常用代码片段篇
  • 发表于 5年前
  • 阅读 96
  • 收藏 0
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

一、用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
博文 121
码字总数 300412
×
呢喃的猫咪
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: