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

2023-03-18 1829阅读

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

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购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]