脚本宝典收集整理的这篇文章主要介绍了PHP HTML代码串截取代码,脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
而且给的数据是HTML代码串,比如这样:
截取的时候是要
截取 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会
自动加上等
标签):
$body = tidy_get_body($tidy);
这个时候你可以用 var_dump 看一些 $body 的结构,会发现它把每个
标签都变成了
一个对应的对象,里面有相应的
属性。举例来说,比如
sdf ,这么一条语句对应的一些
属性有:
name=>”a”
value => “
sdf”
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 = mb_strimwidth($subchild->value,$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 HTML代码串截取代码全部内容,希望文章能够帮你解决PHP HTML代码串截取代码所遇到的问题。
如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。