php中文支持函数

php中文截取字符串

<?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, 1, 0, 'gb2312' );
?> 

 

<?
/**
 * 字符截取 支持UTF8/GBK 英文数字1个字节 gbk2个字节,utf-8 3个字节
 * @param $string
 * @param $length
 * @param $dot
 */
function str_cut($string, $length, $charset = 'utf-8', $dot = '...') {
    if (!in_array(strtoupper($charset), array('UTF-8', 'GBK'))) {
        $charset = 'utf-8';
    }
    $strlen = strlen($string);
    if($strlen <= $length) return $string;
    $string = str_replace(array(' ','&nbsp;', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'), array('∵',' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), $string);
    $strcut = '';
    if(strtolower($charset) == 'utf-8') {
        $length = intval($length-strlen($dot)-$length/3);
        $n = $tn = $noc = 0;
        while($n < strlen($string)) {
            $t = ord($string[$n]);
            if($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) {
                $tn = 1; $n++; $noc++;
            } elseif(194 <= $t && $t <= 223) {
                $tn = 2; $n += 2; $noc += 2;
            } elseif(224 <= $t && $t <= 239) {
                $tn = 3; $n += 3; $noc += 2;
            } elseif(240 <= $t && $t <= 247) {
                $tn = 4; $n += 4; $noc += 2;
            } elseif(248 <= $t && $t <= 251) {
                $tn = 5; $n += 5; $noc += 2;
            } elseif($t == 252 || $t == 253) {
                $tn = 6; $n += 6; $noc += 2;
            } else {
                $n++;
            }
            if($noc >= $length) {
                break;
            }
        }
        if($noc > $length) {
            $n -= $tn;
        }
        $strcut = substr($string, 0, $n);
        $strcut = str_replace(array('∵', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'), array(' ', '&amp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;'), $strcut);
    } else {
        $dotlen = strlen($dot);
        $maxi = $length - $dotlen - 1;
        $current_str = '';
        $search_arr = array('&',' ', '"', "'", '“', '”', '—', '<', '>', '·', '…','∵');
        $replace_arr = array('&amp;','&nbsp;', '&quot;', '&#039;', '&ldquo;', '&rdquo;', '&mdash;', '&lt;', '&gt;', '&middot;', '&hellip;',' ');
        $search_flip = array_flip($search_arr);
        for ($i = 0; $i < $maxi; $i++) {
            $current_str = ord($string[$i]) > 127 ? $string[$i].$string[++$i] : $string[$i];
            if (in_array($current_str, $search_arr)) {
                $key = $search_flip[$current_str];
                $current_str = str_replace($search_arr[$key], $replace_arr[$key], $current_str);
            }
            $strcut .= $current_str;
        }
    }
    return $strcut.$dot;
}

PHP中文字符串翻转

通常情况下翻转一个字符串只需要strrev()函数就可以了,但有时我需要处理是字符串是含中文的,这样用strrev就会出现乱码,因此我们需要自定义一个函数来处理含中文的字符。

function cstrrev($str)
{
	$len = strlen($str);
	for($i = 0; $i < $len; $i++)
	{
		$char = $str{0};
		if(ord($char) > 127)
		{
			$i++;
			if($i < $len)
			{
				$arr[] = substr($str, 0, 2);
				$str = substr($str, 2);
			}
		}
		else
		{
			$arr[] = $char;
			$str = substr($str, 1);
		}
	}
	return join(array_reverse($arr));
}
#使用方法:
$str = '中文.look!';
echo cstrrev($str);
#结果输出:!kool.文中

 str_replace

function str_replace_cn($needle, $str, $haystack, $charset = "utf-8"){
		$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";
		$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";
		$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";
		$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";

		preg_match_all($re[$charset], $haystack, $match_haystack);
		preg_match_all($re[$charset], $needle, $match_needle);

		for($i = 0; $i < count($match_needle); $i ++){
			if(!in_array($match_needle[0][$i], $match_haystack[0]))return $haystack;//无匹配
		}

		$match_haystack = $match_haystack[0];
		$match_needle = $match_needle[0];

		for($i = 0; $i < count($match_haystack); $i ++){
			if($match_haystack[$i] == "")continue;
			if($match_haystack[$i] == $match_needle[0]){
				if(count($match_needle) == 1){//如果只一个字符
					$match_haystack[$i] = $str;
				}else{
					$flag = true;
					for($j = 1; $j < count($match_needle); $j ++){
						if($match_haystack[$i + $j] != $match_needle[$j]){
							$flag = false;
							break;
						}
					}
					if($flag){//匹配
						$match_haystack[$i] = $str;
						for($j = 1; $j < count($match_needle); $j ++){
							$match_haystack[$i + $j] = "";
						}
					}
				}
			}
		}
		return implode("", $match_haystack);
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值