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+javascript实现二级级联菜单的制作
May 06 PHP
win2003服务器使用WPS的COM组件的一些问题解决方法
Jan 11 PHP
PHP四舍五入精确小数位及取整
Jan 14 PHP
PHP SESSION的增加、删除、修改、查看操作
Mar 20 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
Sep 10 PHP
PHP 实现的将图片转换为TXT
Oct 21 PHP
PHP使用Mysqli类库实现完美分页效果的方法
Apr 07 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
php事务回滚简单实现方法示例
Mar 28 PHP
php基于环形链表解决约瑟夫环问题示例
Nov 07 PHP
PHP获取当前系统时间的方法小结
Oct 03 PHP
Yii框架函数简单用法分析
Sep 09 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
生成缩略图
2006/10/09 PHP
php fsockopen伪造post与get方法的详解
2013/06/14 PHP
php针对cookie操作的队列操作类实例
2014/12/10 PHP
ucenter通信原理分析
2015/01/09 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
用JavaScript实现一个代码简洁、逻辑不复杂的多级树
2014/05/23 Javascript
NodeJS制作爬虫全过程(续)
2014/12/22 NodeJs
jQuery实现进度条效果代码
2015/12/17 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
Bootstrap 3.x打印预览背景色与文字显示异常的解决
2016/11/06 Javascript
详解jQuery中ajax.load()方法
2017/01/25 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
JS实现的tab页切换效果完整示例
2018/12/18 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
javascript异常处理实现原理详解
2020/02/17 Javascript
用于统计项目中代码总行数的Python脚本分享
2015/04/21 Python
详解字典树Trie结构及其Python代码实现
2016/06/03 Python
基于python(urlparse)模板的使用方法总结
2017/10/13 Python
13个最常用的Python深度学习库介绍
2017/10/28 Python
Python scipy的二维图像卷积运算与图像模糊处理操作示例
2019/09/06 Python
基于Python解密仿射密码
2019/10/21 Python
python 有效的括号的实现代码示例
2019/11/11 Python
python创建学生成绩管理系统
2019/11/22 Python
解决os.path.isdir() 判断文件夹却返回false的问题
2019/11/29 Python
python 两个一样的字符串用==结果为false问题的解决
2020/03/12 Python
在IE6系列等老式浏览器中使用HTML5的新标签实现方案
2012/12/25 HTML / CSS
const char*, char const*, char*const的区别是什么
2014/07/09 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
2015/10/12 面试题
信息工程学院毕业生推荐信
2013/11/05 职场文书
会计岗位职责
2013/11/08 职场文书
群众路线四风对照检查材料
2014/11/04 职场文书
迎国庆主题班会
2015/08/17 职场文书
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL
使用HBuilder制作一个简单的HTML5网页
2022/07/07 HTML / CSS