可以保证单词完整性的PHP英文字符串截取代码分享
更新时间:2014年07月15日 09:15:38 投稿:junjie
这篇文章主要介绍了可以保证单词完整性的PHP英文字符串截取代码分享,代码中包含详细注释,需要的朋友可以参考下
直接上代码:
/**
* 完整词的截取
*
* @param $str
* @param $start
* @param $length
*
* @return string
*/
public static function usubstr($str, $start, $length = null)
{
// 先正常截取一遍.
$res = substr($str, $start, $length);
$strlen = strlen($str);
/* 接着判断头尾各6字节是否完整(不残缺) */
// 如果参数start是正数
if ($start >= 0) {
// 往前再截取大约6字节
$next_start = $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr($str, $next_start, $next_len);
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr($str, $prev_start, $start - $prev_start);
} // start是负数
else {
// 往前再截取大约6字节
$next_start = $strlen + $start + $length; // 初始位置
$next_len = $next_start + 6 <= $strlen ? 6 : $strlen - $next_start;
$next_segm = substr($str, $next_start, $next_len);
// 如果第1字节就不是 完整字符的首字节, 再往后截取大约6字节.
$start = $strlen + $start;
$prev_start = $start - 6 > 0 ? $start - 6 : 0;
$prev_segm = substr($str, $prev_start, $start - $prev_start);
}
// 判断前6字节是否符合utf8规则
if (preg_match('@^([x80-xBF]{0,5})[xC0-xFD]?@', $next_segm, $bytes)) {
if (!empty($bytes[1])) {
$bytes = $bytes[1];
$res .= $bytes;
}
}
// 判断后6字节是否符合utf8规则
$ord0 = ord($res[0]);
if (128 <= $ord0 && 191 >= $ord0) {
// 往后截取 , 并加在res的前面.
if (preg_match('@[xC0-xFD][x80-xBF]{0,5}$@', $prev_segm, $bytes)) {
if (!empty($bytes[0])) {
$bytes = $bytes[0];
$res = $bytes . $res;
}
}
}
if (strlen($res) < $strlen) {
$res = $res . '...';
}
return $res;
}
相关文章
PHP包含文件函数include、include_once、require、require_once区别总结
include() 、require()语句包含并运行指定文件。这两结构在包含文件上完全一样,唯一的区别是对于错误的处理。require()语句在遇到包含文件不存在,或是出错的时候,就停止即行,并报错。include()则继续即行。2014-04-04
使用session upload_progress实现文件包含实例详解
这篇文章主要为大家介绍了使用session upload_progress实现文件包含实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2022-12-12


最新评论