msubstr php字符串截取
例子一:
$str = "我是PHP程序员,我爱学PHP";
echo msubstr($str, 2, 8);
//输出为'PHP程序员'
例子二:
$str = "我是PHP程序员,我爱学PHP";
echo msubstr($str, 0, 5);
//输出为'我是PHP'
例子三:
$str = "我是PHP程序员,我爱学PHP";
echo msubstr($str, 6, 4);
//输出为'程序员'
function msubstr($str, $start=0, $length, $charset="utf-8", $suffix=true){ //函数定义
if(function_exists("mb_substr")){ //如果有mb_substr函数
if($suffix){
return mb_substr($str, $start, $length, $charset)."..."; //返回截取后的字符串、省略号
}else{
return mb_substr($str, $start, $length, $charset); //返回截取后的字符串
}
}elseif(function_exists('iconv_substr')){ //如果有iconv_substr函数
if($suffix){
return iconv_substr($str,$start,$length,$charset)."..."; //返回截取后的字符串、省略号
}else{
return iconv_substr($str,$start,$length,$charset); //返回截取后的字符串
}
} //如果两个函数都不存在,说明mbstring和iconv扩展都未安装,那么直接返回字符串
$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); //使用正则表达式匹配需要截取的字符
$slice = join("",array_slice($match[0], $start, $length));
//使用join函数将匹配结果放在一起,使用array_slice函数截取指定长度的字符串
if($suffix){
return $slice."…"; //返回截取后的字符串、省略号
}else{
return $slice; //返回截取后的字符串
}
}
从上面的代码中我们可以看出,msubstr()函数的本质原理是通过对字符串的正则匹配,然后使用array_slice()函数来提取指定长度的子字符串。而在这一过程中,如果安装有mbstring和iconv扩展,那么就会直接使用内置函数来处理多字节字符,否则就会采用正则表达式进行截取。
最后要提醒的是,在使用msubstr()函数的时候,由于多字节字符的特殊性,我们需要注意传递的参数,如$length则意味着截取几个字符或者几个字节,并不是截取几个汉字或者几个英文字母。因此,我们在编写代码的时候需要多进行测试,以确保msubstr()函数能够正确地截取出想要的字符串。