- 开发无止境 -
Data: 2018-06-26 21:04:00Form: JournalClick: 11
解决PHP使用mb_substr方法截取中文返回空白的原因
最近手上在玩个新项目,有个需求是从一段文章中平均抽出10段,每段20个字。一切开始都比较顺利,算法也简单。先用mb_strwidth函数来计算总文章字节数,用mb_strwidth函数的好处就是,该函数在计算中文时算2个字节,英文1个字节。
mb_strimwidth($thisContent,开始截取字数,需要输出多少字数,'utf-8');
因为得出结果是字节数所以我这边比较偷懒字节除2,如果要严谨的话,这边就需要把中英文分别剥离出来然后再统计字数,这边就不讨论这个。
把字数除10取整后,这就是每次文章的开始截取的字数点。循环用mb_substr函数跑10次,就输出10断不一样的段落了。
mb_substr函数是以计算中文字数的方式直接计算,这就是为什么上一步要除2。
for($i=0;$i<10;$i++){
$keyword=mb_substr($thisContent,round(单段字数*$i),每次要输出的字数,"utf-8");
}
开始在项目上跑的时候发现了一些问题,例如会偶尔返回空白截取失败。
输出原文来比较没发现异样,直接查看源码发现有一大堆空格占位,用str_replace替换掉空格继续跑。
str_replace(“ ”,””,$thisContent);
后来又出现一样故障,这次更诡异,原文一切正常,无空位无异常符号,检查代码也找不出原因。
直接原文输出到文本用TEXT文本工具打开以及用Fiddler跟DW2014查看,这总没错。期间用了无数方法无解,正绝望时刚好换一台电脑继续做,上面装的是2018版 DW,卧槽,一堆无效字符,bug秒破。
这个符号复制不出来,只能在新版本DW里头能修改,添加上这个诡异的点,故障解除。
DW 2018版本里头修改
切换到DW2014版本里头就没了。
这个问题让我烧脑了2天,误打误撞才得以解决,不然就变成一个诡异的bug了。
各位要是有兴趣自己测试的话,自己也可以测试一下
链接: https://pan.baidu.com/s/1X_VY337fDSJdxheCAei3_w 提取码: pkuk
所以工具还是用新的版本比较好,毕竟大公司的研发工程师什么问题没考虑过,都会给你想好了,就不需要自己走弯路了。