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 相关文章推荐
php中static静态变量的使用方法详解
Jun 04 PHP
PHP学习散记_编码(json_encode 中文不显示)
Nov 10 PHP
PHP安全的URL字符串base64编码和解码
Jun 19 PHP
php数组操作之键名比较与差集、交集赋值的方法
Nov 10 PHP
php通过分类列表产生分类树数组的方法
Apr 20 PHP
PHP框架Laravel学习心得体会
Oct 28 PHP
基于PHP实现等比压缩图片大小
Mar 04 PHP
php文件缓存方法总结
Mar 16 PHP
PHP开发制作一个简单的活动日程表Calendar
Jun 20 PHP
php判断用户是否关注微信公众号
Jul 22 PHP
CMSPRESS 10行代码搞定 PHP无限级分类2
Mar 30 PHP
PHP实现发送微博消息功能完整示例
Dec 04 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中feof()函数实例测试
2014/08/23 PHP
PHP @ at 记号的作用示例介绍
2014/10/10 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
PHP简单获取上月、本月、近15天、近30天的方法示例
2017/07/03 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
php定期拉取数据对比方法实例
2019/09/22 PHP
JavaScript的Cookies
2008/01/16 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
JQUERY的属性选择符和自定义选择符使用方法(二)
2011/04/07 Javascript
jQuery源码分析-01总体架构分析
2011/11/14 Javascript
jquery常用操作小结
2014/07/21 Javascript
在JavaScript中操作时间之getMonth()方法的使用
2015/06/10 Javascript
JavaScript简单生成 N~M 之间随机数的方法
2017/01/13 Javascript
react-router JS 控制路由跳转实例
2017/06/15 Javascript
微信小程序富文本渲染引擎的详解
2017/09/30 Javascript
jQuery实现简单的回到顶部totop功能示例
2017/10/16 jQuery
基于js文件加载优化(详解)
2018/01/03 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
vue 界面刷新数据被清除 localStorage的使用详解
2018/09/16 Javascript
微信小程序实现判断是分享到群还是个人功能示例
2019/05/03 Javascript
node读写Excel操作实例分析
2019/11/06 Javascript
js使用文档就绪函数动态改变页面内容示例【innerHTML、innerText】
2019/11/07 Javascript
Python数组条件过滤filter函数使用示例
2014/07/22 Python
Python操作MongoDB数据库PyMongo库使用方法
2015/04/27 Python
Python上传package到Pypi(代码简单)
2016/02/06 Python
Python二叉搜索树与双向链表转换实现方法
2016/04/29 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
python之语音识别speech模块
2020/09/09 Python
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
物流专业大学的自我评价
2014/01/11 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
市场部岗位职责范本
2015/04/15 职场文书
清洁工工作总结
2015/08/11 职场文书
养成教育主题班会
2015/08/13 职场文书
JS前端可视化canvas动画原理及其推导实现
2022/08/05 Javascript