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 相关文章推荐
10条PHP编程习惯助你找工作
Sep 29 PHP
一个php Mysql类 可以参考学习熟悉下
Jun 21 PHP
服务器web工具 php环境下
Dec 29 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
php实现将wav文件转换成图像文件并在页面中显示的方法
Apr 21 PHP
简单介绍PHP非阻塞模式
Mar 03 PHP
PHP环境搭建(php+Apache+mysql)
Nov 14 PHP
php的4种常用运行方式详解
Dec 22 PHP
PHP获取redis里不存在的6位随机数应用示例【设置24小时过时】
Jun 07 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
phpcms实现验证码替换及phpcms实现全站搜索功能教程详解
Dec 13 PHP
php微信公众号开发之简答题
Oct 20 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
关于PHP5 Session生命周期介绍
2010/03/02 PHP
Laravel框架路由配置总结、设置技巧大全
2014/09/03 PHP
安装ImageMagick出现error while loading shared libraries的解决方法
2014/09/23 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
js操作textarea方法集合封装(兼容IE,firefox)
2011/02/22 Javascript
javascript实现文本域写入字符时限定字数
2014/02/12 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
jQuery+css3实现转动的正方形效果(附demo源码下载)
2016/01/27 Javascript
jquery解析XML及获取XML节点名称的实现代码
2016/05/18 Javascript
原生js实现jquery函数animate()动画效果的简单实例
2016/08/21 Javascript
javascript replace()第二个参数为函数时的参数用法
2016/12/26 Javascript
angular2路由切换改变页面title的示例代码
2017/08/23 Javascript
JavaScript之创意时钟项目(实例讲解)
2017/10/23 Javascript
Vue 处理表单input单行文本框的实例代码
2019/05/09 Javascript
详解vue-cli3开发Chrome插件实践
2019/05/29 Javascript
深入了解query和params的使用区别
2019/06/24 Javascript
nodejs一个简单的文件服务器的创建方法
2019/09/13 NodeJs
python 中文乱码问题深入分析
2011/03/13 Python
python判断端口是否打开的实现代码
2013/02/10 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python模拟登陆实现代码
2017/06/14 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Python  unittest单元测试框架的使用
2018/09/08 Python
python tkinter库实现气泡屏保和锁屏
2019/07/29 Python
python中watchdog文件监控与检测上传功能
2020/10/30 Python
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
大一自我鉴定范文
2013/10/04 职场文书
单方离婚协议书范本(2014版)
2014/09/30 职场文书
群众路线教育实践活动学习笔记
2014/11/05 职场文书
优秀小学生事迹材料
2014/12/26 职场文书
课外活动实习计划
2015/01/19 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
python自动化八大定位元素讲解
2021/07/09 Python
部分武汉产收音机展览
2022/04/07 无线电