php截取中文
㈠ php分割中英文字符串的几种方
对一段文字按照字数进行分割,因为文字中可能是中英文混合的,而php函数strlen只能计算出字串的字节数,于是自己实现了几个函数,分享下。
例1,计算字符总长度。
01<?php
02functionccStrLen($str)#计算中英文混合<ahref="/"target="_blank"class="infotextkey">字符串</a>的长度
03{
04$ccLen=0;
05$ascLen=strlen($str);
06$ind=0;
07$hasCC=ereg(”[xA1-xFE]“,$str);#判断是否有汉字
08$hasAsc=ereg(”[x01-xA0]“,$str);#判断是否有ASCII字符
09if($hasCC&&!$hasAsc)#只有汉字的情况
10returnstrlen($str)/2;
11if(!$hasCC&&$hasAsc)#只有Ascii字符的情况
12returnstrlen($str);
13for($ind=0;$ind<$ascLen;$ind++)
14{
15if(ord(substr($str,$ind,1))>0xa0)
16{
17$ccLen++;
18$ind++;
19}
20else
21{
22$ccLen++;
23}
24}
25return$ccLen;
26}
27?>
例2,从左侧截取字符串。
01<?php
02functionccStrLeft($str,$len)#从左边截取中英文混合字符串
03{
04$ascLen=strlen($str);if($ascLen<=$len)return$str;
05$hasCC=ereg(”[xA1-xFE]“,$str);#同上
06$hasAsc=ereg(”[x01-xA0]“,$str);
07if(!$hasCC)returnsubstr($str,0,$len);
08if(!$hasAsc)
09if($len&0×01)#如果长度是奇数
10returnsubstr($str,0,$len+$len-2);
11else
12returnsubstr($str,0,$len+$len);
13$cind=0;$flag=0;$reallen=0;//实际取字节长
14while($cind<$ascLen&&$reallen<$len)
15{//bywww.jbxue.com
16if(ord(substr($str,$cind,1))<0xA1){//如果该字节为英文则加一
17$cind++;
18}else{//否则加2个字节
19$cind+=2;
20}
21$reallen++;
22}
23returnsubstr($str,0,$cind);
24}
25?>
例3,把给定文字,按切割数量存入数组(适合短篇文字,长文章可没分隔一部分就直接处理一次)
viewsourceprint?
01<?php
02functionSplitContent($content,$smslen){
03$str_tmp=$content;
04$arr_cont=array();
05$len_tmp=0;
06$i=0;//分割绝对位置
07while(strlen($str_tmp)>0){
08$str_tmp=ccStrLeft($str_tmp,$smslen);
09array_push($arr_cont,$str_tmp);
10$i+=strlen($str_tmp);
11$str_tmp=substr($content,$i,strlen($content));
12}
13return$arr_cont;
14}//bywww.jbxue.com
15?>
测试:
1<?php
2$str=’a计算中英文混合1234字符串的长度abcd’;
3echo$str.’的长度为:’.ccStrLen($str);
4echo‘<br>’;
5$smslen=3;//截取长度
6print_r(SplitContent($str,$smslen));
7?>
㈡ php如何获取中文字符长度,一个中文字符算一个
在PHP中专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函数并非PHP的核心函数,所以,它们常常有可能没有开启。要在php.ini中开启即可。获取长度实例:1 ,utf-8环境下使用
header('Content-type:text/html;charset=utf-8');
/**
*可以统计中文字符串长度的函数
*@param$str要计算长度的字符串
*@param$type计算长度类型,0(默认)表示一个中文算一个字符,1表示一个中文算两个字符
*
*/
functionabslength($str)
{
if(empty($str)){
return0;
}
if(function_exists('mb_strlen')){
returnmb_strlen($str,'utf-8');
}
else{
preg_match_all("/./u",$str,$ar);
returncount($ar[0]);
}
}
$str='我们都是中国人啊,ye!';
$len=abslength($str);
var_mp($len);//return12
$len=abslength($str,'1');
echo'<br/>'.$len;//return22
/*
utf-8编码下截取中文字符串,参数可以参照substr函数
@param$str要进行截取的字符串
@param$start要进行截取的开始位置,负数为反向截取
@param$end要进行截取的长度
*/
functionutf8_substr($str,$start=0){
if(empty($str)){
returnfalse;
}
if(function_exists('mb_substr')){
if(func_num_args()>=3){
$end=func_get_arg(2);
returnmb_substr($str,$start,$end,'utf-8');
}
else{
mb_internal_encoding("UTF-8");
returnmb_substr($str,$start);
}
}
else{
$null="";
preg_match_all("/./u",$str,$ar);
if(func_num_args()>=3){
$end=func_get_arg(2);
returnjoin($null,array_slice($ar[0],$start,$end));
}
else{
returnjoin($null,array_slice($ar[0],$start));
}
}
}
$str2='wo要截取zhongwen';
echo'<br/>';
echoutf8_substr($str2,0,-4);//returnwo要截取zhon
2,支持gb2312,gbk,utf-8,big5 中文截取方法
/*
* 中文截取,支持gb2312,gbk,utf-8,big5
*
* @param string $str 要截取的字串
* @param int $start 截取起始位置
* @param int $length 截取长度
* @param string $charset utf-8|gb2312|gbk|big5 编码
* @param $suffix 是否加尾缀
*/
public function csubstr($str, $start=0, $length, $charset="utf-8", $suffix=true)
{
if(function_exists("mb_substr"))
{
if(mb_strlen($str, $charset) <= $length) return $str;
$slice = mb_substr($str, $start, $length, $charset);
}
else
{
$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], $str, $match);
if(count($match[0]) <= $length) return $str;
$slice = join("",array_slice($match[0], $start, $length));
}
if($suffix) return $slice."…";
return $slice;
}
㈢ php截取一段字符串中第一个出现的数字或字母或冒号前面的中文汉字的语句怎么写
/**
*截取函数,中文一个,英文两个算一个
*/
functionmbsubstr($str,$start=0,$length,$suffix=true,$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],$str,$match);
$strArr=$match[0];
$str=array_values(tempStrArr($strArr));
$strArrCount=count($str);
if($strArrCount==$length+1){
$length+=1;
}
$slice=implode('',array_slice($str,$start,$length));
if($strArrCount>$length){
return$suffix?$slice.'...':$slice;
}else{
return$slice;
}
}
functiontempStrArr($strArr){
$e=range('a','z');
$i=count($strArr);
foreach($strArras$k=>$v){
if(in_array(strtolower($v),$e)){
if(in_array(strtolower($strArr[$k+1]),$e)){
$strArr[$k]=$v.$strArr[$k+1];
unset($strArr[$k+1]);
陆腔break;
宽昌}
慎悉扒}elseif($v>0&&$v<10&&$strArr[$k+1]>0&&$strArr[$k+1]<10){
$strArr[$k]=$v.$strArr[$k+1];
unset($strArr[$k+1]);
break;
}
$i--;
}
if($i>0){
$strArr=tempStrArr($strArr);
}
return$strArr;
}
截取字符串, 中英文都可以
㈣ php 截取两个中文字中间的字符串 怎么实现
<?php
header('Content-Type:text/html;charset=utf-8');
$str="网络知道提了截取中文字符串的问题";
$t1=mb_strpos($str,'提');
$t2=mb_strpos($str,'串');
echo$s=mb_substr($str,$t1,$t2-$t1);
㈤ php字符串截取函数用法分析
本文实例分析了php字符串截取函数用法。分享给大家供大家参考。具体分析如下:
php自带的截取字符串的函数只能处理英文,数字的不能截取中文混排的,后面一个示例比较好用,第一个主要是给初学者学学用的,具体代码如下:
复制代码
代码如下:<?php
//构造字符串
$str
=
"ABCDEFGHIJKLMNOPQRSTUVWXYZ";
echo
"原字符串:<b>".$str."</b><br>";
//按各种方式进行截取
$str1
=
substr($str,5);
echo
"从第5个字符开始取裤枝键至最后:".$str1."<br>";
$str2
=
substr($str,9,4);
echo
"从第9个字符开始取4个字符:".$str2."<br>";
$str3
=
substr($str,-5);
echo
"取倒胡巧数5个字符:".$str3."<br>";
$str4
=
substr($str,-8,4);
echo
"从倒数第8个字符开始向后取4个字符:".$str4."<br>";
$str5
=
substr($str,-8,-2);
echo
"从倒数第8个字符开始取到倒数第2个字符为止:".$str5."<br>";
?>
支持中英文混合截取,代码如下:
复制代码
代码如下:<?php
/*
------------------------------------------------------
参数:
$str_cut
需要截断的字符串
$length
允许字符串显示的最大长度
程序功能:截取全角和半角(汉字和英文)混合的字搭丛符串以避免乱码
------------------------------------------------------
*/
function
substr_cut($str_cut,$length)
{
if
(strlen($str_cut)
>
$length)
{
for($i=0;
$i
<
$length;
$i++)
if
(ord($str_cut[$i])
>
128)
$i++;
$str_cut
=
substr($str_cut,0,$i)."..";
}
return
$str_cut;
}
?>
希望本文所述对大家的php程序设计有所帮助。
㈥ php中有几个截取字符创的函数
函数名 作用 php版本
chr() 从指定的 ASCII 值返回字符。 3
chunk_split() 把字符串分割为一连串更小的部分。 3
count_chars() 返回字符串所用字符的信息。 4
explode() 把字符串打散为数组。 3
implode() 把数组元素组合为一个字符串。 3
join() implode() 的别名。 3
levenshtein() 返回两个字符串之间的 Levenshtein 距离。 3
localeconv() 返回包含本地数字及货币信息格式的数组。 4
ltrim() 从字符串左侧删除空格或其他预定义字符。 3
md5() 计算字符串的 MD5 散列。 3
md5_file() 计算文件的 MD5 散列。 4
metaphone() 计算字符串的 metaphone 键。 4
money_format() 把字符串格式化为货币字符串。 4
nl_langinfo() 返回指定的本地信息。 4
nl2br() 在字符串中的每个新行之前插入 HTML 换行符。 3
number_format() 通过千位分组来格式化数字。 3
parse_str() 把查询字符串解析到变量中。 3
print() 输出一个或多个字符串。 3
printf() 输出格式化的字符串。 3
similar_text() 计算两个字符串的匹配字符的数目。 3
sprintf() 把格式化的字符串写写入一个变量中。 3
str_ireplace() 替换字符串中的一些字符。(对大小写不敏感) 5
str_replace() 替换字符串中的一些字符。(对大小写敏感) 3
str_split() 把字符串分割到数组中。 5
strcasecmp() 比较两个字符串。(对大小写不敏感) 3
strchr() 搜索字符串在另一字符串中的第一次出现。strstr() 的别名 3
strcspn() 返回在找到任何指定的字符之前,在字符串查找的字符数。 3
stripos() 返回字符串在另一字符串中第一次出现的位置(大小写不敏感) 5
stristr() 查找字符串在另一字符串中第一次出现的位置(大小写不敏感) 3
strlen() 返回字符串的长度。 3
strpbrk() 在字符串中搜索指定字符中的任意一个。 5
strpos() 返回字符串在另一字符串中首次出现的位置(对大小写敏感) 3
strrchr() 查找字符串在另一个字符串中最后一次出现的位置。 3
strripos() 查找字符串在另一字符串中最后出现的位置(对大小写不敏感) 5
strrpos() 查找字符串在另一字符串中最后出现的位置(对大小写敏感) 3
strspn() 返回在字符串中包含的特定字符的数目。 3
strstr() 搜索字符串在另一字符串中的首次出现(对大小写敏感) 3
strtok() 把字符串分割为更小的字符串。 3
strtr() 转换字符串中特定的字符。 3
substr() 返回字符串的一部分。 3
substr_compare() 从指定的开始长度比较两个字符串。 5
substr_count() 计算子串在字符串中出现的次数。 4
substr_replace() 把字符串的一部分替换为另一个字符串。 4
ucwords() 把字符串中每个单词的首字符转换为大写。 3
wordwrap() 按照指定长度对字符串进行折行处理。 4
㈦ php中explode截取中文又乱码,求解~~
如下面例子,在GBK编码下会产生乱码。
原因,在php6之前,字符是以字节形式存在的,字符"碪"的gbk字节码是"B4 55",而字符"U"的字节码是"55",在explode函数中第一个参数的字符串会转成相应的字节,然后和第二个参数凯答的字节码比对,进行分割。
在下面例子中就是 55 分割 B4 55 B4 55 55 B4 55 B4 55 ,所以"碪"字被分割了。
这种情况很多,所以在败孙闭php中使用explode时应多注意!
<?php
$result = explode("U", "碪碪U碪碪");
print_r($result);
?>
我也碰到这问题了,正在研究字母解决察裂
㈧ 如何利用PHP来截取一段中文字符串而不出现乱码
/*
功能:截取全角和半角混合的字符串以避免租仿伏乱码
参数大伏:
$str_cut 需要截弊携断的字符串
$length 允许字符串显示的最大长度
*/
function substr_cut($str_cut,$length = 30){
if (strlen($str_cut) >; $length){
for($i=0; $i < $length; $i++)
if (ord($str_cut[$i]) >; 128) $i++;
$str_cut = substr($str_cut,0,$i) . "...";
}
return $str_cut;
}
㈨ 如何去掉PHP字符串中的中文字符
我给你个PHP截取中文字符串的方法总结,有原理,有源码:程序一:PHP截取中文字符串方法由于网站首页以及vTigerCRM里经常在截取中文字符串时出现乱码(使用substr),今天找到一个比较好的截取中文字符串方法,在此与大家共享。function msubstr($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;
}程序二:PHP截取UTF-8字符串,解决半字符问题/******************************************************************
* PHP截取UTF-8字符串,解决半字符问题。
* 英文、数字(半角)为1字节(8位),中文(全角)为3字节
* @return 取出的字符串, 当$len小于等于0时, 会返回整个字符串
* @param $str 源字符串
* $len 左边的子串的长度
****************************************************************/
function utf_substr($str,$len)
{
for($i=0;$i<$len;$i++)
{
$temp_str=substr($str,0,1);
if(ord($temp_str) > 127)
{
$i++;
if($i<$len)
{
$new_str[]=substr($str,0,3);
$str=substr($str,3);
}
}
else
{
$new_str[]=substr($str,0,1);
$str=substr($str,1);
}
}
return join($new_str);
}
?>php utf-8 字符串截取<?
function cutstr($string, $length) {
preg_match_all("/[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]/", $string, $info);
for($i=0; $i<count($info[0]); $i++) {
$wordscut .= $info[0][$i];
$j = ord($info[0][$i]) > 127 ? $j + 2 : $j + 1;
if ($j > $length - 3) {
return $wordscut." ...";
}
}
return join('', $info[0]);
}
$string="242432反对感是456犯得上广泛大使馆地方7890";
for($i=0;$i<strlen($string);$i++)
{
echo cutstr($string,$i)."<br>";
}
?>
截取utf-8字符串函数为了支持多语言,数据库里的字符串可能保存为UTF-8编码,在网站开发中可能需要用php截取字符串的一部分。为了避免出现乱码现象,编写如下的UTF-8字符串截取函数关于utf-8的原理请看 UTF-8 FAQUTF-8编码的字符可能由1~3个字节组成, 具体数目可以由第一个字节判断出来。(理论上可能更长,但这里假设不超过3个字节)
第一个字节大于224的,它与它之后的2个字节一起组成一个UTF-8字符
第一个字节大于192小于224的,它与它之后的1个字节组成一个UTF-8字符
否则第一个字节本身就是一个英文字符(包括数字和一小部分标点符号)。以前为某网站设计的代码(也是现在用在首页的长度截取的函数)
Code:
<?php // Cut_Str;
//$sourcestr 是要处理的字符串
//$cutlength 为截取的长度(即字数)
function cut_str($sourcestr,$cutlength)
{
$returnstr='';
$i=0;
$n=0;
$str_length=strlen($sourcestr);//字符串的字节数
while (($n<$cutlength) and ($i<=$str_length))
{
$temp_str=substr($sourcestr,$i,1);
$ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
if ($ascnum>=224) //如果ASCII位高与224,
{
$returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范,将3个连续的字符计为单个字符
$i=$i+3; //实际Byte计为3
$n++; //字串长度计1
}
elseif ($ascnum>=192) //如果ASCII位高与192,
{
$returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范,将2个连续的字符计为单个字符
$i=$i+2; //实际Byte计为2
$n++; //字串长度计1
}
elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数仍计1个
$n++; //但考虑整体美观,大写字母计成一个高位字符
}
else //其他情况下,包括小写字母和半角标点符号,
{
$returnstr=$returnstr.substr($sourcestr,$i,1);
$i=$i+1; //实际的Byte数计1个
$n=$n+0.5; //小写字母和半角标点等与半个高位字符宽...
}
}
if ($str_length>$cutlength){
$returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
}
return $returnstr;}截取utf-8字符串函数function FSubstr($title,$start,$len="",$magic=true)
{
/**
* powered by Smartpig
* mailto:[email protected]
*/if($len == "") $len=strlen($title);
if($start != 0)
{
$startv = ord(substr($title,$start,1));
if($startv >= 128)
{
if($startv < 192)
{
for($i=$start-1;$i>0;$i--)
{
$tempv = ord(substr($title,$i,1));
if($tempv >= 192) break;
}
$start = $i;
}
}
}
if(strlen($title)<=$len) return substr($title,$start,$len);
$alen = 0;
$blen = 0;
$realnum = 0;
for($i=$start;$i<strlen($title);$i++)
{
$ctype = 0;
$cstep = 0;
$cur = substr($title,$i,1);
if($cur == "&")
{
if(substr($title,$i,4) == "<")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,4) == ">")
{
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,5) == "&")
{
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(substr($title,$i,6) == """)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$alen ++;
}
}
else if(preg_match("/(d+);?/i",substr($title,$i,8),$match))
{
$cstep = strlen($match[0]);
$length += strlen($match[0]);
$i += strlen($match[0])-1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}
}else{
if(ord($cur)>=252)
{
$cstep = 6;
$length += 6;
$i += 5;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=248){
$cstep = 5;
$length += 5;
$i += 4;
$realnum ++;
if($magic)
{
$ctype = 1;
$blen ++;
}
}elseif(ord($cur)>=240){
$cstep = 4;
$length += 4;
$i += 3;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=224){
$cstep = 3;
$length += 3;
$i += 2;
$realnum ++;
if($magic)
{
$ctype = 1;
$blen ++;
}
}elseif(ord($cur)>=192){
$cstep = 2;
$length += 2;
$i += 1;
$realnum ++;
if($magic)
{
$blen ++;
$ctype = 1;
}
}elseif(ord($cur)>=128){
$length += 1;
}else{
$cstep = 1;
$length +=1;
$realnum ++;
if($magic)
{
if(ord($cur) >= 65 && ord($cur) <= 90)
{
$blen++;
}else{
$alen++;
}
}
}
}
if($magic)
{
if(($blen*2+$alen) == ($len*2)) break;
if(($blen*2+$alen) == ($len*2+1))
{
if($ctype == 1)
{
$length -= $cstep;
break;
}else{
break;
}
}
}else{
if($realnum == $len) break;
}
}
unset($cur);
unset($alen);
unset($blen);
unset($realnum);
unset($ctype);
unset($cstep);
return substr($title,$start,$length);
}
㈩ [php]如何在PHP中截取中文字串无乱码
一年前写的一个函数。用法与substr一样,支持中文。您也可以加以改进。
//截取字符串含数,对系统函数的改进,不会将中文变乱。
function mysubstr ($str,$start,$len=0,$cutchar="…") {
$str=str_replace("",' ',$str);
$str=str_replace("“",'“',$str);
$str=str_replace("”",'”',$str);
$str=str_replace("—",'—',$str);
$str=str_replace(""",'"',$str);
$str=str_replace(''',"'",$str);
$str=str_replace("<",'<',$str);
$str=str_replace(">",'>',$str);
$str=str_replace("&",'&',$str);
$str=preg_replace("/[\s]+/"," ",$str);
$tolen=strlen($str);
if(!($start==0 && $len>=$tolen)){
//为方便操作,先将起始值和长度值转换为正数
if($start<0)$start=$tolen+$start;if($start<0)$start=0;if($start>$tolen)return "";
if($len<=0)$len=($tolen+$len)-$start;if($len<1)return "";
if($len>$tolen)$len=$tolen;
for($i=0;$i<$start;$i++){
if(ord(substr($str,$i,1))>127){$i++;}
}
$start=$i; //起始位置计算完成
for($k=0;$k<$len;$k++,$i++){
if(ord(substr($str,$i,1))>127){$i++;$k++;}
}
$len=$k; //长度计算完成
$str=substr($str,$start,$len);
if($start>0){$str=$cutchar.$str;}
if($start+$len<$tolen){$str.=$cutchar;}
}
$str=str_replace("&",'&',$str);
$str=str_replace('"','"',$str);
$str=str_replace("'",''',$str);
$str=str_replace("<",'<',$str);
$str=str_replace(">",'>',$str);
return $str;
}