PHP截取中文字符串函数总结,php字符串截取问题

作者: 计算机网络  发布:2019-09-26

常用的php函数

希望将一个字符串限长显示,如果该字符串超过一定长数,就截取前n个字符,后加省略号。 但是在英文和汉字混合的情况下会出现如下问题: 

strstr(string,string)            //从前面第一次出现某个字符串的地方截取到最后
strrchr(string,string)         //从某个字符串从最后出现的位置截取到结尾
strpos(string,string[,int])  //某个字符串第一次出现的位置
strrpos(string,string)      //某个字符串最后一次出现的位置
substr(string,int[,int])    //从指定位置开始截取字符串,可以指定截取的长度。
strlen(string)               //获取字符串的长度PHP截取开始和结束标记间的字符

如果有这样一个字符串 
$str="这是一个字符串"; 
为了截取该串的前10个字符,使用 
if(strlen($str)>10) $str=substr($str,10)."…"; 
那么,echo $str的输出应该是"这是一个字…" 

方法一:利用explode对字符串进行分

假设 
$str="这是1个字符串"; 
这个串中包含了一个半角字符,同样执行: 
if(strlen($str)>10) $str=substr($str,10); 
由于原字符串$str的第10、11个字符构成了汉字“符”; 
执行串分割后会将该汉字一分为二,这样被截取的串就会发现乱码现象。 

 代码如下

请问这种问题如何解决?即要使过长字符串实现分割,又不能让它发生乱码?

/**
* Get the content between $start and $end
*
* @param string $content 原始字符
* @param string $start     起始字符
* @param string $end      结束字符
* @return string
*/
function GetStringBetween($content,$start,$end){
    $r = explode($start, $content);
    if (isset($r[1])){
        $r = explode($end, $r[1]);
        return $r[0];
    }
    return '';
}

复制代码代码如下:

方法二:利用substr截取字符,由于php组件函数,因此字符串处理效率比explode方法要高一些

<?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++; 
            } 
        } //(脚本学堂 www.jbxue.com 编辑整理)
        $num%2==1 ? $content=substr($content,0,$length-4):$content=substr($content,0,$length-3); 
    } 
    return $content; 

?>

 代码如下

 

/**
* Get the content between $start and $end
*
* @param string $content 原始字符
* @param string $start     起始字符
* @param string $end      结束字符
* @return string
*/
function get_string_between($string, $start, $end){
    $string = " ".$string;
    $ini = strpos($string,$start);
    if ($ini == 0) return "";
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return substr($string,$ini,$len);
}

复制代码代码如下:

 

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; 
}

PHP截取所有符合起始与结束标记的字符串

复制代码代码如下:

 代码如下

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]; 
                        } 
                } //(脚本学堂 www.jbxue.com 编辑整理)
                 $result = strlen($result) > $len ? substr($result, 0, -2) . $tail : $result . $tail; 
        }else{ 
                $result = $str; 
        } 
        return $result; 
}

/**
* Get all every strings between two tags
*
* @param string $string 原始字符串
* @param string $start  起始字符串
* @param string $end   结束字符串
* @return array
*/
function get_all_strings_between($string,$start,$end)
{
    //Returns an array of all values which are between two tags in a set of data
    $strings = array();
    $startPos = 0;
    $i = 0;
    //echo strlen($string)."n";
    while($startPos < strlen($string) && $matched = get_string_between(substr($string,$startPos),$start,$end))
    {
        if ($matched == null || $matched[1] == null || $matched[1] == '') break;
        $startPos = $matched[0]+$startPos+1;
        array_push($strings,$matched[1]);
        $i++;
    }
    return $strings;
}

以下是一些补充: 1. 截取GB2312中文字符串 
代码如下: 

function get_string_between($string, $start, $end){
    $ini = strpos($string,$start);
    if ($ini == 0) return null;
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return array($ini+$len,substr($string,$ini,$len));
}

复制代码代码如下:

php截取起始与结束标记间字符,带截取次数、是否允许重复选项

<?php 
//截取中文字符串 
function mysubstr($str, $start, $len) { 
$tmpstr = ""; 
$strlen = $start + $len; 
for($i = 0; $i < $strlen; $i++) { 
if(ord(substr($str, $i, 1)) > 0xa0) { 
$tmpstr .= substr($str, $i, 2); 
$i++; 
} else 
$tmpstr .= substr($str, $i, 1); 

return $tmpstr; 

?> 

 代码如下

  1. 截取utf8编码的多字节字符串 
    代码如下: 

 

复制代码代码如下:

/**
* Get all every strings between two tags
*
* @param string $string 原始字符串
* @param string $start  起始字符串
* @param string $end   结束字符串
* @return array
*/
function get_all_strings_between($string,$start,$end)
{
    //Returns an array of all values which are between two tags in a set of data
    $strings = array();
    $startPos = 0;
    $i = 0;
    //echo strlen($string)."n";
    while($startPos < strlen($string) && $matched = get_string_between(substr($string,$startPos),$start,$end))
    {
        if ($matched == null || $matched[1] == null || $matched[1] == '') break;
        $startPos = $matched[0]+$startPos+1;
        array_push($strings,$matched[1]);
        $i++;
    }
    return $strings;
}

<?php 
//截取utf8字符串 
function utf8Substr($str, $from, $len) 

return preg_replace('#^(?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$from.'}'. 
'((?:[x00-x7F]|[xC0-xFF][x80-xBF]+){0,'.$len.'}).*#s', 
'$1',$str); 

?> 

function get_string_between($string, $start, $end){
    $ini = strpos($string,$start);
    if ($ini == 0) return null;
    $ini += strlen($start);
    $len = strpos($string,$end,$ini) - $ini;
    return array($ini+$len,substr($string,$ini,$len));
}

  1. UTF-8、GB2312都支持的汉字截取函数 
    代码如下: 

截取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 
{  //(脚本学堂 www.jbxue.com 编辑整理)
 $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'); 
?> 

< ?php
//截取中文字符串
function mysubstr($str, $start, $len) {
$tmpstr = "";
$strlen = $start + $len;
for($i = 0; $i < $strlen; $i++) {
if(ord(substr($str, $i, 1)) > 0xa0) {
$tmpstr .= substr($str, $i, 2);
$i++;
} else
$tmpstr .= substr($str, $i, 1);
}
return $tmpstr;
}
?>

  1. BugFree 的字符截取函数 
    代码如下: 

截取utf8编码的多字节字符串

复制代码代码如下:

 代码如下

<?php 
/** 
* @package BugFree 
* @version $Id: FunctionsMain.inc.php,v 1.32 2005/09/24 11:38:37 wwccss Exp $ 


* 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) 
{ //(脚本学堂 www.jbxue.com 编辑整理)
 $StringLast .= "..."; 

return $StringLast; 

}$String = "www.baidu.com"; 
$Length = "18"; 
$Append = false; 
echo sysSubStr($String,$Length,$Append); 
?> 

< ?php
//截取utf8字符串
function utf8Substr($str, $from, $len)
{
return preg_replace('#^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$from.'}'.
'((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,'.$len.'}).*#s',
'$1',$str);
}
?>

本文由金沙澳门官网送注册58发布于计算机网络,转载请注明出处:PHP截取中文字符串函数总结,php字符串截取问题

关键词: