PHP-php如何实现智能截串问题?

PHP-php如何实现智能截串问题?

虐人心 发布于 2017-04-02 字数 779 浏览 1217 回复 5

如题如何实现智能截串,要求如下:

1 标准截串长度为 360 ,汉字,字母,符号 等视为 1 字节处理,实际截出来的串可以跟据一下条件自动调整。
2 如果在第360位是汉字,或字母 则 按语义截取(只考虑词组),例:中国 (“中”字为第360位)要求截出的结果为361位,单词也一样 hello (中e为第360为 但是截取时要求截取完整的单词)
3 由于内容中有图片,图片的形式为<img src='www.xxx.com/xxx/xxx.jpg' title='图片描述'/> ,提及,提及的形式为:<a href='http://www.xxx.com'>@提及</a>,还有外链,形式同提及。 如何截取整段html代码,不要截成:<a href='http:// (因为截取到//时正好360位)这样会原样输出,也会导致页面样式乱掉

现在优先考虑 1 和 3 点。。。
请教下大家有什么简单的办法么?思路也行。。
也可以考虑每个单词或汉字词语 视为 1 位 处理

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

偏爱自由 2017-10-31 5 楼

Google “php 截取中文字符”
分词
由于Html的复杂性,截取html会造成各种不可预料的的问题,补充标签什么的都治标不治本,很难保证html的完整性。

从根本上解决的方法,要么按@scoolin所说,一开始就过滤html标签,有图片的文章可以分析dom摘选首几张图片,这是大部分网站的做法。

要么使用PHP Tidy类,对html进行完整性修复,可以保证html不被破坏。

偏爱自由 2017-10-02 4 楼

第一个要求可以把字符串转换到UTF16后做到。
第二个要求比较难,需要进行中文分词,看看ICTCLAS汉语分词开源系统

归属感 2017-08-07 3 楼

可以考虑每个汉字当做一个字符处理。网上有很多中文字符串截断的方案,我基本上都看过,都会有这样那样的问题,不是很完美。
这里推荐一个UTF-8字符串截断的方案,是久经考验值得信赖的。欢迎试用。
截断字符串实现代码如下(php):

function subString_UTF8($str, $start, $lenth)
{
$len = strlen($str);
$r = array();
$n = 0;
$m = 0;
for($i = 0; $i < $len; $i++) {
$x = substr($str, $i, 1);
$a = base_convert(ord($x), 10, 2);
$a = substr('00000000'.$a, -8);
if ($n < $start){
if (substr($a, 0, 1) == 0) {
}elseif (substr($a, 0, 3) == 110) {
$i += 1;
}elseif (substr($a, 0, 4) == 1110) {
$i += 2;
}
$n++;
}else{
if (substr($a, 0, 1) == 0) {
$r[ ] = substr($str, $i, 1);
}elseif (substr($a, 0, 3) == 110) {
$r[ ] = substr($str, $i, 2);
$i += 1;
}elseif (substr($a, 0, 4) == 1110) {
$r[ ] = substr($str, $i, 3);
$i += 2;
}else{
$r[ ] = '';
}
if (++$m >= $lenth){
break;
}
}
}
return join($r);
} // End subString_UTF8;

参考:http://www.cnblogs.com/jiji262/archive/2012/07/03/2574441.html

想挽留 2017-06-29 2 楼

第一个,统一utf-8编码,用mb_substr,设置encoding为utf-8就ok了
第二个,需要分词词库,获取到370位,再去词库里匹配
第三个,可以考虑domdocument,既然只是截取,可以考虑去掉所有html标签,只留下text

清晨说ぺ晚安 2017-06-22 1 楼

mb_substr函数就能实现
对于中文的智能补充的话,需要一个字库,才能补充
对于英文的智能补充,可以判断后面一个字符是不是空格或者tab之类的分隔符
html标签补充的话,如果只需要补充最后一个截断的html标签,只需要查找最后一个标签的开始,就可以。