dedecms重新定义cn_substr函数截取字数的方法(substring截取指定字符之后字符)

2023-03-18 1833阅读

温馨提示:这篇文章已超过733天没有更新,请注意相关的内容是否还可用!

dedecms重新定义cn_substr函数截取字数的方法DedeCMS是一款常用的开源CMS系统,其内置的cn_substr函数可以截取指定长度的字符串。但是在实际使用中,我们经常会遇到需要截取指定字符之后的字符串的情况。首先,我们来看一下cn_substr函数的定义:```function cn_substr{if{if(mb_strlen($str, $charset)
dedecms重新定义cn_substr函数截取字数的方法

dedecms重新定义cn_substr函数截取字数的方法(substring截取指定字符之后字符)

DedeCMS是一款常用的开源CMS系统,其内置的cn_substr函数可以截取指定长度的字符串。但是在实际使用中,我们经常会遇到需要截取指定字符之后的字符串的情况。本文将介绍如何重新定义cn_substr函数来实现这个功能。

首先,我们来看一下cn_substr函数的定义:

```

function cn_substr($str, $start, $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[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf]{2}|\xf0[\x90-\xbf][\x80-\xbf]{2}|[\xf1-\xf7][\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 && (strlen($slice) < strlen($str)))

{

return $slice.'...';

}

return $slice;

}

```

可以看到,该函数接收五个参数:$str表示要截取的字符串,$start表示起始位置,$length表示要截取的长度,$charset表示字符集,$suffix表示是否显示省略号。

为了实现截取指定字符之后的字符串,我们需要对该函数进行修改。具体方法是:先找到指定字符的位置,然后再调用substr函数来截取字符串。

以下是修改后的代码:

```

function cn_substr($str, $start, $length, $charset="utf-8", $suffix=true, $delimiter='')

{

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[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf]{2}|\xf0[\x90-\xbf][\x80-\xbf]{2}|[\xf1-\xf7][\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));

}

$pos = strpos($slice, $delimiter);

if($pos !== false){

$slice = substr($slice, $pos + strlen($delimiter));

}

if($suffix && (strlen($slice) < strlen($str)))

{

return $slice.'...';

}

return $slice;

}

```

我们新增了一个参数$delimiter,用于指定要截取的字符。在函数中,首先调用原来的截取函数来获取子串$slice,然后再用strpos函数查找$delimiter在$slice中的位置,如果找到了,则调用substr函数来截取$slice中$delimiter之后的部分。

使用方法:

```

$str = '这是一段测试文字,我想截取“测试”之后的内容。';

echo cn_substr($str, 0, 10, 'utf-8', true, '测试'); //输出“文字,我想截取“测试”之后的内容。”

```

除了截取指定字符之后的字符串,有时候我们还需要截取指定长度的字符串,并且保证最后一个字符不被截断。这时候可以使用PHP自带的substr函数来实现,例如:

```

function my_substr($str, $len, $suffix=true){

if(mb_strlen($str) <= $len){

return $str;

}

$new_str = substr($str, 0, $len

有云计算,存储需求就上慈云数据:点我进入领取200元优惠券
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]