php使HTML标签自动补全闭合函数代码


Posted in PHP onOctober 04, 2012

简单解释一些代码:
第一个 ~(<[^>]+?>)~si
这个正则是匹配<………>中的内容。简单说是所有的<标签>。
第二个 ~<([a-z0-9]+)[^/>]*?/>~si
这个正则是匹配<……/>中的内容。是单闭合标签 如<br />
第三个 ~</([a-z0-9]+)[^/>]*?>~si
这个正则是匹配</......>中的内容。也就是结束标签 如</a>
第四个 ~<([a-z0-9]+)[^/>]*?>~si
匹配<......>中的内容。这和第一个是不一样的,这一个是真正的html标签,因为html标签只有数字和字母,如:<h1></h1>
第五个 ~<!--.*?-->~si
不用解释了,HTMl的注释
剩下的可以看源代码了,php源码附件:

<?php 
/** 
* 取HTML,并自动补全闭合 
* 
* param $html 
* 
* param $length 
* 
* param $end 
*/ 
function subHtml($html, $length=50) { 
$result = ''; 
$tagStack = array(); 
$len = 0; 
$contents = preg_split("~(<[^>]+?>)~si", $html, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); 
foreach($contents as $tag) { 
if (trim($tag) == "") continue; 
if (preg_match("~<([a-z0-9]+)[^/>]*?/>~si", $tag)) { 
$result .= $tag; 
} else if (preg_match("~</([a-z0-9]+)[^/>]*?>~si", $tag, $match)) { 
if ($tagStack[count($tagStack)-1] == $match[1]) { 
array_pop($tagStack); 
$result .= $tag; 
} 
} else if (preg_match("~<([a-z0-9]+)[^/>]*?>~si", $tag, $match)) { 
array_push($tagStack, $match[1]); 
$result .= $tag; 
} else if (preg_match("~<!--.*?-->~si", $tag)) { 
$result .= $tag; 
} else { 
if ($len + mstrlen($tag) < $length) { 
$result .= $tag; 
$len += mstrlen($tag); 
} else { 
$str = msubstr($tag, 0, $length - $len + 1); 
$result .= $str; 
break; 
} 
} 
} while (!empty($tagStack)) { 
$result .= '</' . array_pop($tagStack) . '>'; 
} 
return $result; 
} 
/** 
* 取中文字符串 
* 
* param $string 字符串 
* 
* param $start 起始位 
* 
* param $length 长度 
* 
* param $charset 编码 
* 
* param $dot 附加字串 
*/ 
function msubstr($string, $start, $length, $dot = '', $charset = 'UTF-8') { 
$string = str_replace(array('&', '"', '<', '>', ' '), array('&', '"', '<', '>', ' '), $string); 
if (strlen($string) <= $length) { 
return $string; 
} 
if (strtolower($charset) == 'utf-8') { 
$n = $tn = $noc = 0; 
while ($n < strlen($string)) { 
$t = ord($string[$n]); 
if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { 
$tn = 1; 
$n++; 
} elseif (194 <= $t && $t <= 223) { 
$tn = 2; 
$n += 2; 
} elseif (224 <= $t && $t <= 239) { 
$tn = 3; 
$n += 3; 
} elseif (240 <= $t && $t <= 247) { 
$tn = 4; 
$n += 4; 
} elseif (248 <= $t && $t <= 251) { 
$tn = 5; 
$n += 5; 
} elseif ($t == 252 || $t == 253) { 
$tn = 6; 
$n += 6; 
} else { 
$n++; 
} 
$noc++; 
if ($noc >= $length) { 
break; 
} 
} 
if ($noc > $length) { 
$n -= $tn; 
} 
$strcut = substr($string, 0, $n); 
} else { 
for($i = 0; $i < $length; $i++) { 
$strcut .= ord($string[$i]) > 127 ? $string[$i] . $string[++$i] : $string[$i]; 
} 
} 
return $strcut . $dot; 
} 
/** 
* 得字符串的长度,包括中英文。 
*/ 
function mstrlen($str, $charset = 'UTF-8') { 
if (function_exists('mb_substr')) { 
$length = mb_strlen($str, $charset); 
} elseif (function_exists('iconv_substr')) { 
$length = iconv_strlen($str, $charset); 
} else { 
preg_match_all("/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]|\xf0[\x90-\xbf][\x80-f][\x80-\xbf]|[\xf1-\xf7][\x80-\xbf][\x80-\xbf][\x80-\xbf]/", $text, $ar); 
$length = count($ar[0]); 
} 
return $length; 
} 
$str = "<div><table>x<tr>1s<td>测试<td>124"; 
echo subHtml($str); 
?>
PHP 相关文章推荐
自己动手做一个SQL解释器
Oct 09 PHP
PHP新手上路(八)
Oct 09 PHP
实用函数5
Nov 08 PHP
PHP 面向对象实现代码
Nov 11 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
PHP开发者常犯的10个MySQL错误更正剖析
Jan 30 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
linux实现php定时执行cron任务详解
Dec 24 PHP
php生成静态页面的简单示例
Apr 17 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
Jan 20 PHP
详解PHP实现支付宝小程序用户授权的工具类
Dec 25 PHP
php中explode与split的区别介绍
Oct 03 #PHP
PHP explode()函数用法、切分字符串
Oct 03 #PHP
PHP读取文件并可支持远程文件的代码分享
Oct 03 #PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 #PHP
PHP获取搜索引擎关键字来源的函数(支持百度和谷歌等搜索引擎)
Oct 03 #PHP
PHP HTML JavaScript MySQL代码如何互相传值的方法分享
Sep 30 #PHP
ThinkPHP3.0略缩图不能保存到子目录的解决方法
Sep 30 #PHP
You might like
PHP新手上路(十一)
2006/10/09 PHP
PHP 进程锁定问题分析研究
2009/11/24 PHP
destoon实现调用自增数字从1开始的方法
2014/08/21 PHP
php设置静态内容缓存时间的方法
2014/12/01 PHP
Symfony查询方法实例小结
2017/06/28 PHP
jQuery 跨域访问问题解决方法
2009/12/02 Javascript
用jQuery扩展自写的 UI导航
2010/01/13 Javascript
做好七件事帮你提升jQuery的性能
2014/02/06 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery使用empty()方法删除元素及其所有子元素的方法
2015/03/26 Javascript
javascript格式化json显示实例分析
2015/04/21 Javascript
JavaScript中的this到底是什么(一)
2015/12/09 Javascript
浅析$(function) ready和onload 的区别
2016/09/03 Javascript
深究AngularJS中ng-drag、ng-drop的用法
2017/06/12 Javascript
微信小程序支付及退款流程详解
2017/11/30 Javascript
JS实现HTML页面中动态显示当前时间完整示例
2018/07/30 Javascript
解决vue.js 数据渲染成功仍报错的问题
2018/08/25 Javascript
layui动态绑定事件的方法
2019/09/20 Javascript
JavaScript单线程和任务队列原理解析
2020/02/04 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
2020/05/09 Javascript
原生JS实现相邻月份日历
2020/10/13 Javascript
Python NumPy库安装使用笔记
2015/05/18 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
python3.7 使用pymssql往sqlserver插入数据的方法
2019/07/08 Python
python使用sessions模拟登录淘宝的方式
2019/08/16 Python
使用PyOpenGL绘制三维坐标系实例
2019/12/24 Python
Django nginx配置实现过程详解
2020/09/10 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
Fossil加拿大官网:化石手表、手袋、首饰及配饰
2019/04/23 全球购物
沙特阿拉伯家用电器和电子产品购物网站:Sheta and Saif
2020/04/03 全球购物
先进党支部事迹材料
2014/01/13 职场文书
给客户的检讨书
2014/12/21 职场文书
岳麓书院导游词
2015/02/03 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书