仓酷云

标题: PHP编程:PHP截取HTML代码串成绩 [打印本页]

作者: 因胸联盟    时间: 2015-2-3 23:51
标题: PHP编程:PHP截取HTML代码串成绩
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。需求:将一段文字截取必定的物理长度显示,注重,要截取的不是字符串的字节数,UFT-8 的编码中文字符是3个字节或4个字节的,而显示的时分中文会占两个字符的长度,英文字符只占一个,全角的时分又有分歧。   并且给的数据是HTML代码串,好比如许:
<div class=”aaa”><a href=http://www.webjx.com//php/2009-07-21/”/aaa.php?id=1&Prime;>张三</a>  评论了 <a href=”/aaa.php?id=444&Prime;>李四</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&prime;);  // 最初一个是设置编码的,注重,这里是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&prime;) >= $len)
{
$subchild->value = http://www.webjx.com//php/2009-07-21/mb_strimwidth($subchild->value, 0, $len, ‘…’, ‘utf-8&prime;);
$trimed_str .= $subchild->value;
break;
}
else
{
$trimed_str .= $subchild->value;
$len = $len - mb_strwidth($subchild->value, ‘utf-8&prime;);
}
外面的$subchild 就是一个子节点。注重,这里利用了 mb_strwidth 来获得字符串长度。严重保举一下这个 mb_strwidth,很好用,它会把中文看成两个字符长度处置,正好合适这里的需求!并且截取字符串的时分用到了 mb_strimwidth,这个函数也会把中文看成两个字符长度处置,mb_ 开首的函数真是好用啊。
详细代码我就不写出来了,由于是针对一个需求写的,没做成通用的模式。哪天我有工夫做成通用的再宣布一下。
别的,惋惜FireFox不撑持 text-overflow 属性,否则也不必后台那末辛劳地去截断了。
PHP成功的插入,删除,更新数据的时候,显然,你已经距离成功指日可待了。
作者: 深爱那片海    时间: 2015-2-4 06:31
个人呢觉得,配wamp 最容易漏的一步就是忘了把$PHP$目录下的libmysql.dll拷贝到windows系统目录的system32目录下,还有重启apache。
作者: 仓酷云    时间: 2015-2-5 06:20
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 老尸    时间: 2015-2-11 06:05
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 精灵巫婆    时间: 2015-2-27 14:43
使用 jquery 等js框架的时候,要随时注意浏览器的更新情况,不然很容易发生框架不能使用。
作者: 飘灵儿    时间: 2015-3-1 10:18
实践是检验自己会不会的真理。
作者: 莫相离    时间: 2015-3-7 21:30
为了以后维护的方便最好是代码上都加上注释,“予人方便,自己方便”。此外开发文档什么的最好都弄齐全。我觉得这是程序员必备的素质。虽然会消耗点很多的时间。但是确实是非常有必要的。
作者: 海妖    时间: 2015-3-22 01:10
要进行开发,搭建环境是首先需要做的事,windows下面我习惯把环境那个安装在C盘下面,因为我配的环境经常出现诡异事件,什么事都没做环境有的时候就不能用啦。
作者: 若天明    时间: 2015-3-29 15:23
实践是检验自己会不会的真理。
作者: 小妖女    时间: 2015-4-4 11:17
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 第二个灵魂    时间: 2015-4-6 17:03
先学习php和mysql,还有css(html语言很简单)我认为现在的效果比以前的方法好。
作者: 因胸联盟    时间: 2015-4-14 05:16
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 透明    时间: 2015-4-18 05:51
多看优秀程序员编写的代码,仔细理解他们解决问题的方法,对自身有很大的帮助。
作者: 活着的死人    时间: 2015-4-22 04:22
这些中手常用的知识,当你把我说的这些关键字都可以熟练运用的时候,你可以选择自己
作者: 灵魂腐蚀    时间: 2015-5-4 12:21
最后祝愿,php会给你带来快乐的同时 你也会给他带来快乐。
作者: 蒙在股里    时间: 2015-5-9 08:49
实践是检验自己会不会的真理。
作者: admin    时间: 2015-6-10 07:10
真正的方向了,如果将来要去开发团队,你一定要学好smarty ,phplib这样的模板引擎,
作者: 只想知道    时间: 2015-6-14 19:34
如果你已经到这种程度了,那么你已经可以做我的老师了。其实php也分很多的区域,
作者: 爱飞    时间: 2015-6-23 21:33
最后介绍一个代码出错,但是老找不到错误方法,就是 go to wc (囧),出去换换气没准回来就找到错误啦。
作者: 金色的骷髅    时间: 2015-6-24 21:01
使用zendstdio 写代码的的时候,把tab 的缩进设置成4个空格是很有必要的




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2