设为首页 收藏本站
查看: 674|回复: 0

[经验分享] php的字符串截取

[复制链接]

尚未签到

发表于 2017-3-28 12:08:06 | 显示全部楼层 |阅读模式
  这个功能在php输出页面的时候很常用,就是把一个字符串截取为不大于某个长度的字符串。本身是很简单的事情,但是附加了一些需求:1,字符串中含有中文,也就是单字节双字节混着的。2,字符串中含有html代码。
  对于中文截取,网上有现成的代码可以拿来用,就像这样:

DSC0000.gif functiontrunk($str,$most,$append="...")
{
if(strlen($str)<=$most){
return$str;
}
returnsubstr_cut($str,$most-strlen($append)).$apend;
}

functionsubstr_cut($str_cut,$length){

if(strlen($str_cut)>$length){
for($i=0;$i<$length;$i++)
if(ord($str_cut[$i])>128)$i++;
$str_cut=substr($str_cut,0,$i);
}
return$str_cut;
}


  这里就是简单的判断一下字节是否大于128,是就往前多移一位。因为对于GB2312编码,凡双字节第一个字节都是大于128的。
  至于第二个需求,含有html代码的,其实我觉得这样的要求通过css来做更加合适了。
  通过设置width,height,line-height限定其块大小后,再设定overflow:hidden;就可以做到了。如果只为IE而做的话,那么有更多的CSS手段来控制超出边界后的处理。
  如果一定要自己写程序处理的话,我想最好是只处理简单情况,如果仅为了截取含html代码的字符串就要写一个完全的html parser的话,未免太小题大作了。这里我写了一段仅处理成对、非嵌套情况的:
  

functiontrunkhtml($str,$most,$append="..."){
$arr=preg_split("/(<[^>]*>)/",$str,-1,PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_OFFSET_CAPTURE);
$istag=FALSE;
$notagstr="";
foreach($arras$v){
if(!$istag)$notagstr.=$v[0];
$istag=!$istag;
}
if(strlen($notagstr)<=$most){
return$str;
}
$str_cut=substr_cut($notagstr,$most-strlen($append));
$cut_len=strlen($str_cut);
$istag=FALSE;
foreach($arras$i=>$v){
if(!$istag){
$len=strlen($v[0]);
if($cut_len>$len)$cut_len-=$len;
else{
$pos=$v[1]+$cut_len;
if($i%4==0){
returnsubstr($str,0,$pos).$append;
}
else{
$ret=substr($str,0,$pos).$append;
if(isset($arr[$i+1]))$ret.=$arr[$i+1][0];
return$ret;
}
}
}
$istag=!$istag;
}
assert(FALSE);
return$str_cut;
}


  这里做法也不复杂,先用正则把它分割开来,取出不在<>中的部分拼在一起,先用前面的substr_cut截取一次,记住最终截了多长。然后再用各个部分长度去减,减到不够的时候就确定是截在哪个位置了。因为假定html标签都是成对的,最后再判断一下是否处在一对标签中。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-356453-1-1.html 上篇帖子: php读写json文件 下篇帖子: php中的MVC模式运用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表