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 相关文章推荐
PHP4和PHP5共存于一系统
Nov 17 PHP
Ajax+PHP 边学边练 之二 实例
Nov 24 PHP
php中使用__autoload()自动加载未定义类的实现代码
Feb 06 PHP
PHP+jQuery实现自动补全功能源码
May 15 PHP
ThinkPHP 3.2 数据分页代码分享
Oct 14 PHP
php站内搜索关键词变亮的实现方法
Dec 30 PHP
详解在PHP的Yii框架中使用行为Behaviors的方法
Mar 18 PHP
php微信开发之上传临时素材
Jun 24 PHP
php 微信公众平台开发模式实现多客服的实例代码
Nov 07 PHP
PHP使用ajax的post方式下载excel文件简单示例
Aug 06 PHP
PHP数据源架构模式之表入口模式实例分析
Jan 23 PHP
PHP执行linux命令6个函数代码实例
Nov 24 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
业余方法DIY电子管FM收音机
2021/03/02 无线电
第十节 抽象方法和抽象类 [10]
2006/10/09 PHP
php关于array_multisort多维数组排序的使用说明
2011/01/04 PHP
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
jQuery学习4 浏览器的事件模型
2010/02/07 Javascript
JQuery的Alert消息框插件使用介绍
2010/10/09 Javascript
使用jquery为table动态添加行的实现代码
2011/03/30 Javascript
jQuery判断iframe中元素是否存在的方法
2013/05/11 Javascript
JavaScript获取FCK编辑器信息的具体方法
2013/07/12 Javascript
javascript中apply和call方法的作用及区别说明
2014/02/14 Javascript
如何利用JSHint减少JavaScript的错误
2016/08/23 Javascript
原生JavaScript实现的简单放大镜效果示例
2018/02/07 Javascript
关于js的三种使用方式(行内js、内部js、外部js)的程序代码
2018/05/05 Javascript
JS数组扁平化(flat)方法总结详解
2019/06/24 Javascript
vue router动态路由设置参数可选问题
2019/08/21 Javascript
vue实现Input输入框模糊查询方法
2021/01/29 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
[02:38]DOTA2亚洲邀请赛 IG战队巡礼
2015/02/03 DOTA
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
2017/07/24 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
VSCode基础使用与VSCode调试python程序入门的图文教程
2020/03/30 Python
CSS3实现曲线阴影和翘边阴影
2016/05/03 HTML / CSS
Lacoste美国官网:经典POLO衫品牌
2016/10/12 全球购物
李宁官方网店:中国运动品牌
2017/11/02 全球购物
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
Orvis官网:自1856年以来,优质服装、飞钓装备等
2018/12/17 全球购物
IGK Hair官网:喷雾、洗发水、护发素等
2020/11/03 全球购物
为什么说Ruby是一种真正的面向对象程序设计语言
2012/10/30 面试题
护理毕业生自我鉴定
2014/02/11 职场文书
学习经验演讲稿
2014/05/10 职场文书
民事上诉状范文
2015/05/22 职场文书
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
java开发双人五子棋游戏
2022/05/06 Java/Android
Python实现聚类K-means算法详解
2022/07/15 Python