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 相关文章推荐
支持oicq头像的留言簿(一)
Oct 09 PHP
PHP 模板高级篇总结
Dec 21 PHP
Discuz 模板语句分析及知识技巧
Aug 21 PHP
如何给phpcms v9增加类似于phpcms 2008中的关键词表
Jul 01 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
PHP实现阳历到农历转换的类实例
Mar 07 PHP
php使用Jpgraph绘制3D饼状图的方法
Jun 10 PHP
php实现购物车功能(下)
Jan 05 PHP
CodeIgniter生成静态页的方法
May 17 PHP
PHP获取指定日期是星期几的实现方法
Nov 30 PHP
PHP中大括号'{}'用法实例总结
Feb 08 PHP
PHP递归删除多维数组中的某个值
Apr 17 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 json_encode奇怪问题说明
2011/09/27 PHP
cakephp打印sql语句的方法
2015/02/13 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
PHP 实现的将图片转换为TXT
2015/10/21 PHP
微信公众号开发客服接口实例代码
2016/10/21 PHP
centos+php+coreseek+sphinx+mysql之一coreseek安装篇
2016/10/25 PHP
php中通用的excel导出方法实例
2017/12/30 PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
2018/04/20 PHP
php+ajax 文件上传代码实例
2019/03/18 PHP
js字符编码函数区别分析
2008/06/05 Javascript
javascript css float属性的特殊写法
2008/11/13 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
TimergliderJS 一个基于jQuery的时间轴插件
2011/12/07 Javascript
Javascript基础教程之数据类型 (数值 Number)
2015/01/18 Javascript
基于jQuery实现点击列表加载更多效果
2016/05/31 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
在Vue项目中,防止页面被缩放和放大示例
2019/10/28 Javascript
[01:17:47]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
跟老齐学Python之变量和参数
2014/10/10 Python
python中常用检测字符串相关函数汇总
2015/04/15 Python
Python执行时间的计算方法小结
2017/03/17 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python DataFrame 取差集实例
2019/01/30 Python
django配置连接数据库及原生sql语句的使用方法
2019/03/03 Python
python 递归相关知识总结
2021/03/03 Python
css3实现小箭头各种图形效果
2020/07/08 HTML / CSS
白色公司:The White Company
2017/10/11 全球购物
美国睫毛、眉毛精华液领导品牌:RevitaLash Cosmetics
2018/03/26 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
PHP面试题集
2016/12/18 面试题
大一自我鉴定范文
2013/10/04 职场文书
车贷收入证明范本
2014/01/09 职场文书
总经理任命书范本
2014/06/05 职场文书
民间个人借款协议书
2014/09/30 职场文书
车间安全生产管理制度
2015/08/06 职场文书
一文带你理解vue创建一个后台管理系统流程(Vue+Element)
2021/05/18 Vue.js