PHP 字符串截取和获取字符串长度函数封装
方文锋
2020-05-01 00:38:29
1206
首页学习PHP
/**
* 字符串截取和返回字符串的长度
* @param string $str 要截取的字符串
* @param int $start 字符串截取的初始位置,从0开始
* @param int $length 字符串截取的长度
* @param string $charset 字符串编码
* @param bool $suffix 是否添加后缀
* @param bool $strlen 是否返回字符串的长度(false不返回,true返回)
* @return int|string
*/
function my_substr($str, $start = 0, $length, $charset = 'utf-8', $suffix = true, $strlen = false)
{
$charset || ($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])/";
//返回字符串长度
if ($strlen) {
if (function_exists('mb_strlen')) {
$count = mb_strlen($str, $charset);
} elseif (function_exists('iconv_strlen')) {
$count = iconv_strlen($str, $charset);
} else {
preg_match_all($re[$charset], $str, $match);
$count = count($match[0]);
}
return $count;
}
//截取字符串
if (function_exists("mb_substr"))
$slice = mb_substr($str, $start, $length, $charset);
elseif (function_exists('iconv_substr')) {
$slice = iconv_substr($str, $start, $length, $charset);
if (false === $slice) {
$slice = '';
}
} else {
preg_match_all($re[$charset], $str, $match);
$slice = join("", array_slice($match[0], $start, $length));
}
//字数不满添加后缀 ...
if ($suffix) {
$count = my_substr($str, $start, $length, $charset, false, true);
if ($count > $length) {
return $slice . '......';
} else {
return $slice;
}
} else {
return $slice;
}
}
/**
* 返回字符串长度
* @param string $str
* @param string $charset
* @return int
*/
function my_strlen($str, $charset = 'utf-8')
{
$charset || ($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])/";
//返回字符串长度
if (function_exists('mb_strlen')) {
$count = mb_strlen($str, $charset);
} elseif (function_exists('iconv_strlen')) {
$count = iconv_strlen($str, $charset);
} else {
preg_match_all($re[$charset], $str, $match);
$count = count($match[0]);
}
return $count;
}
/**
* 字符串分隔
* @param string $str
* @param int $split_length
* @param string $charset
* @return array|array[]|bool|false|string[]
*/
function my_str_split($str, $split_length = 1, $charset = 'utf-8')
{
if (func_num_args() == 1 && strtolower($charset) === 'utf-8') {
return preg_split('/(?<!^)(?!$)/u', $str);
}
if ($split_length < 1) {
return false;
}
$len = my_strlen($str, $charset);
$arr = array();
for ($i = 0; $i < $len; $i += $split_length) {
$s = my_substr($str, $i, $split_length, $charset, false);
$arr[] = $s;
}
return $arr;
}