|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。需求:将一段文字截取必定的物理长度显示,注重,要截取的不是字符串的字节数,UFT-8 的编码中文字符是3个字节或4个字节的,而显示的时分中文会占两个字符的长度,英文字符只占一个,全角的时分又有分歧。 并且给的数据是HTML代码串,好比如许:
<div class=”aaa”><a href=http://www.webjx.com//php/2009-07-21/”/aaa.php?id=1″>张三</a> 评论了 <a href=”/aaa.php?id=444″>李四</a> 分享的 <a href=”bbb.html”>一篇文章文章一长串的器材</a></div>
截取的时分是要截取 div 标签外部的器材,并且要保存HTML标签,只是对个中的文字做处置。好比我能够只是截取到“李四”的“李”字,然而假如就如许放到前真个话,“李四”后面的 a 标签是没有闭合的,所以截取以后要包管HTML的语法准确。
这个成绩的确不太好弄,让我愁闷了两天。请注重,这只是一个字符串,只不外内容是HTML代码,是没有甚么DOM的。假如是在前端处置就好办了,直接DOM获得,然后对外面的节点停止处置,最初把innerHTML 之类的器材输入就弄定了。如今可不可了,得换个思绪。同事的思绪是如许的:
遍历字符串的每个字符。设置一个标志,碰着标签入手下手的标志< 就置为1,接上去的字符都不记数,然后碰着>以后再入手下手计数。对标签外部的字符串处置的时分,还要先判别以后字符的编码是否是多是中文,普通来讲PHP中 UTF-8 编码的中文字符的长度都是3,所以假如碰着是中文字符编码,就要跳过两个不记数……说到这里我本人头已入手下手大了。团体以为这类办法很不爽,起首这类精细的逻辑不太轻易掌握,并且 UFT-8 编码下中文发生的长度有多是3个或4个 所以代码的周密性值得嫌疑。
我团体的思绪是,用 Tidy 来弄(详细用法请看PHP手册吧)。昨天研讨了一下谁人 Tidy ,发明这个器材仍是挺好用的。起首,把这个字符串转换成 Tidy 对象,如许:
$tidy = tidy_parse_string($str, array(), ‘utf8′); // 最初一个是设置编码的,注重,这里是utf8 ,不是utf-8,没有两头谁人连线。
然后获得$tidy中的 body(由于转换以后$tidy会主动加上<head><body>等标签):
$body = tidy_get_body($tidy);
这个时分你可以用 var_dump 看一些 $body 的布局,会发明它把每一个标签都酿成了一个对应的对象,外面有响应的属性。举例来讲,好比 <a href=http://www.webjx.com//php/2009-07-21/”#”>sdf</a> ,这么一条语句对应的一些属性有:
name=>”a”
value =http://www.webjx.com//php/2009-07-21/> “<a href=”#”>sdf</a>”
child=> array{[0]=>一个文本节点对象,value是 sdf}
attribute=array{”href”=>”#”}
…..其他属性
可以看到,咱们实际上是可以独自去向理 a 标签对应节点上面的文字节点的值的,那样就不会损坏任何HTML完全性。本来我觉得改动 a 标签中文字节点的值以后, a 标签的value也会随着改动,那样我直接前往a标签对应节点的value就OK了,没想到不是谁人模样,哎,所以处置过个中的文字以后仍是要本人拼出新的HTML。
晓得了Tidy对象的布局以后,一切就好办了,只需遍历一切的节点,关于本需求来讲,就是找到谁人 div 标签,然后入手下手处置外面的节点。代码以下:
if(mb_strwidth($subchild->value, ‘utf-8′) >= $len)
{
$subchild->value = http://www.webjx.com//php/2009-07-21/mb_strimwidth($subchild->value, 0, $len, ‘…’, ‘utf-8′);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, ‘utf-8′);
}
外面的$subchild 就是一个子节点。注重,这里利用了 mb_strwidth 来获得字符串长度。严重保举一下这个 mb_strwidth,很好用,它会把中文看成两个字符长度处置,正好合适这里的需求!并且截取字符串的时分用到了 mb_strimwidth,这个函数也会把中文看成两个字符长度处置,mb_ 开首的函数真是好用啊。
详细代码我就不写出来了,由于是针对一个需求写的,没做成通用的模式。哪天我有工夫做成通用的再宣布一下。
别的,惋惜FireFox不撑持 text-overflow 属性,否则也不必后台那末辛劳地去截断了。
PHP成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。 |
|