PHP HTML代码串截取代码


Posted in PHP onDecember 29, 2008

而且给的数据是HTML代码串,比如这样:
<div class=”aaa”><a href=”/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=”#”>sdf</a> ,这么一条语句对应的一些属性有:
name=>”a”
value => “<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 = 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 相关文章推荐
基于mysql的bbs设计(一)
Oct 09 PHP
PHP动态变静态原理
Nov 25 PHP
PHP define函数的使用说明
Aug 27 PHP
php win下Socket方式发邮件类
Aug 21 PHP
php读取mysql乱码,用set names XXX解决的原理分享
Dec 29 PHP
使用php+apc实现上传进度条且在IE7下不显示的问题解决方法
Apr 25 PHP
php笔记之:数据类型与常量的使用分析
May 14 PHP
php中的ini配置原理详解
Oct 14 PHP
php结合md5的加密解密算法实例
Sep 30 PHP
php使用preg_match()函数验证ip地址的方法
Jan 07 PHP
PHP单例模式定义与使用实例详解
Feb 06 PHP
PHP基于面向对象实现的留言本功能实例
Apr 04 PHP
PHP MSSQL 存储过程的方法
Dec 24 #PHP
php 获取完整url地址
Dec 20 #PHP
php xml-rpc远程调用
Dec 19 #PHP
php 设计模式之 工厂模式
Dec 19 #PHP
php 设计模式之 单例模式
Dec 19 #PHP
PHP 采集程序 常用函数
Dec 18 #PHP
php IP及IP段进行访问限制的代码
Dec 17 #PHP
You might like
国内php原创论坛
2006/10/09 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
php选择排序法实现数组排序实例分析
2015/02/16 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
PHP下SSL加密解密、验证、签名方法(很简单)
2020/06/28 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
通过JavaScript控制字体大小的代码
2011/10/04 Javascript
JavaScript面向对象设计二 构造函数模式
2011/12/20 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
简单的ajax连接库分享(不用jquery的ajax)
2014/01/19 Javascript
JavaScript获取各大浏览器信息图示
2015/11/20 Javascript
js获取及判断键盘按键的方法
2015/12/01 Javascript
AngularJS路由实现页面跳转实例
2017/03/03 Javascript
$.browser.msie 为空或不是对象问题的多种解决方法
2017/03/19 Javascript
JavaScript初学者必看“new”
2017/06/12 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
ES6正则表达式扩展笔记
2017/07/25 Javascript
如何理解Vue的作用域插槽的实现原理
2017/08/19 Javascript
详解JavaScript中的数组合并方法和对象合并方法
2018/05/11 Javascript
微信小程序开发摇一摇功能
2019/11/22 Javascript
[01:04:06]DOTA2上海特级锦标赛A组资格赛#2 Secret VS EHOME第一局
2016/02/26 DOTA
[00:34]TI7不朽珍藏III——纯金地穴编织者饰品展示
2017/07/15 DOTA
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
2019/03/01 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
python代码实现猜拳小游戏
2020/11/30 Python
全面解析HTML5中的标准属性与自定义属性
2016/02/18 HTML / CSS
德国领先的大尺码和超大尺码男装在线零售商:Bigtex
2019/06/22 全球购物
领导班子四风问题对照检查材料
2014/09/27 职场文书
四风问题查摆剖析材料
2014/10/11 职场文书
质量保证书格式
2015/02/27 职场文书
高中美术教学反思
2016/02/17 职场文书
教你如何用cmd快速登录服务器
2022/06/10 Servers