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 相关文章推荐
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
Feb 16 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
PHP中session变量的销毁
Feb 27 PHP
php除数取整示例
Apr 24 PHP
微信公众平台天气预报功能开发
Jul 06 PHP
YII路径的用法总结
Jul 09 PHP
浅谈PHP中单引号和双引号到底有啥区别呢?
Mar 04 PHP
Laravel实现自定义错误输出内容的方法
Oct 10 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
yii2多图上传组件的使用教程
May 10 PHP
Yii框架where查询用法实例分析
Oct 22 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 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
终于听上了直流胆调频
2021/03/02 无线电
深入PHP autoload机制的详解
2013/06/09 PHP
PHP判断文章里是否有图片的简单方法
2014/07/26 PHP
使用PHP如何实现高效安全的ftp服务器(一)
2015/12/20 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
php打开本地exe程序,js打开本地exe应用程序,并传递相关参数方法
2018/02/06 PHP
laravel5 Eloquent 实现事务方式
2019/10/21 PHP
JQUERY实现左侧TIPS滑进滑出效果示例
2013/06/27 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
JS实现仿百度输入框自动匹配功能的示例代码
2014/02/19 Javascript
javascript中replace( )方法的使用
2015/04/24 Javascript
关于JavaScript限制字数的输入框的那些事
2016/08/14 Javascript
javascript中的try catch异常捕获机制用法分析
2016/12/14 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
ztree实现权限横向显示功能
2017/05/20 Javascript
angular4中*ngFor不能对返回来的对象进行循环的解决方法
2018/09/12 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
微信小程序时间选择插件使用详解
2018/12/28 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
Python聚类算法之DBSACN实例分析
2015/11/20 Python
python 简单的多线程链接实现代码
2016/08/28 Python
python放大图片和画方格实现算法
2018/03/30 Python
python中退出多层循环的方法
2018/11/27 Python
python 并发下载器实现方法示例
2019/11/22 Python
5分钟让你掌握css3阴影、倒影、渐变小技巧(小编推荐)
2016/08/15 HTML / CSS
美国流行背包品牌:JanSport(杰斯伯)
2018/03/02 全球购物
美国家用和厨房电器销售网站:Appliances Connection
2020/01/24 全球购物
财务经理的岗位职责
2013/12/17 职场文书
迟到检讨书1000字
2014/01/15 职场文书
建筑工程质量通病防治方案
2014/06/08 职场文书
2014预备党员党课学习心得范文
2014/07/08 职场文书
2014大学生党员评议个人总结
2014/09/22 职场文书
向雷锋同志学习倡议书
2015/04/27 职场文书
表扬稿表扬信的格式及范文
2019/06/24 职场文书