最新消息:

PHP函数第16款:gbk中英文截取,1个中文字节为2个英文字节 cn_substrR

Jquery插件 杨红伟 991浏览 0评论

一:函数简介

cn_substrR,这里的R指的是REQUEST,为什么我们有了gbk和utf8函数截取,这里又多了一个cn_substrR呢?终其原因,它是为了防止黑客的注入而使用的!因为有时候我们在面对一大段内容时,比如新闻简介,里边可能包含一些特殊字符,我们有了这款函数的目的就是要用 stripslashes 过滤掉一些特殊字符,再用 addslashes 再转义回来。再至于有些小朋友认为 stripslashes 和 addslashes 是做什么的?请看这两篇文章来了解 http://www.w3school.com.cn/php/func_string_stripslashes.asp 和 http://www.w3school.com.cn/php/func_string_addslashes.asp 。很明显,它的作用不言而喻!

当然,你的文章如果不开源或者不出名的话,别人也不会拿你的站去注入的。完全用之前两个函数就够了!

演示地址: http://www.ijquery.cn/phpfunction/cn_substrR/demo1.php

下载地址: http://www.ijquery.cn/phpfunction/cn_substrR/cn_substrR.zip

二:函数说明及使用

注意:只有在REQUEST中使用,包括 $_POST 和 $_GET。该函数借助于cn_substr 或者 cn_substr_utf8。所用使用时注意,你一看源代码就懂了。

$name2 = cn_substrR($_REQUEST['fname'], 10);

三:函数源代码

因为我的页面是utf8格式的,所以借用了cn_substr_utf8,如果你的页面是gbk的话,直接使用cn_substr就可以的。

/**
 *  中文截取2,单字节截取模式
 *  如果是request的内容,必须使用这个函数
 *
 * @access    public
 * @param     string  $str  需要截取的字符串
 * @param     int  $slen  截取的长度
 * @param     int  $startdd  开始标记处
 * @return    string
 */
if ( ! function_exists('cn_substrR'))
{
    function cn_substrR($str, $slen, $startdd=0)
    {
        $str = cn_substr_utf8(stripslashes($str), $slen, $startdd);
        return addslashes($str);
    }
}

/**
 *  中文截取2,单字节截取模式
 *
 * @access    public
 * @param     string  $str  需要截取的字符串
 * @param     int  $slen  截取的长度
 * @param     int  $startdd  开始标记处
 * @return    string
 */
if ( ! function_exists('cn_substr'))
{
    function cn_substr($str, $slen, $startdd=0)
    {
        $restr = '';
        $c = '';
        $str_len = strlen($str);
        if($str_len < $startdd+1)
        {
            return '';
        }
        if($str_len < $startdd + $slen || $slen==0)
        {
            $slen = $str_len - $startdd;
        }
        $enddd = $startdd + $slen - 1;
        for($i=0;$i<$str_len;$i++)
        {
            if($startdd==0)
            {
                $restr .= $c;
            }
            else if($i > $startdd)
            {
                $restr .= $c;
            }

            if(ord($str[$i])>0x80)
            {
                if($str_len>$i+1)
                {
                    $c = $str[$i].$str[$i+1];
                }
                $i++;
            }
            else
            {
                $c = $str[$i];
            }

            if($i >= $enddd)
            {
                if(strlen($restr)+strlen($c)>$slen)
                {
                    break;
                }
                else
                {
                    $restr .= $c;
                    break;
                }
            }
        }
        return $restr;
    }
}

/**
 *  utf-8中文截取,单字节截取模式
 *
 * @access    public
 * @param     string  $str  需要截取的字符串
 * @param     int  $slen  截取的长度
 * @param     int  $startdd  开始标记处
 * @return    string
 */
if ( ! function_exists('cn_substr_utf8'))
{
    function cn_substr_utf8($str, $length, $start=0)
    {
        if(strlen($str) < $start+1)
        {
            return '';
        }
        preg_match_all("/./su", $str, $ar);
        $str = '';
        $tstr = '';

        //为了兼容mysql4.1以下版本,与数据库varchar一致,这里使用按字节截取
        for($i=0; isset($ar[0][$i]); $i++)
        {
            if(strlen($tstr) < $start)
            {
                $tstr .= $ar[0][$i];
            }
            else
            {
                if(strlen($str) < $length + strlen($ar[0][$i]) )
                {
                    $str .= $ar[0][$i];
                }
                else
                {
                    break;
                }
            }
        }
        return $str;
    }
}

四:函数图片

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址