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 相关文章推荐
require(),include(),require_once()和include_once()的异同
Jan 02 PHP
PHP array_push 数组函数
Dec 26 PHP
简单的php新闻发布系统教程
May 09 PHP
php绘制一个扇形的方法
Jan 24 PHP
php中instanceof 与 is_a()区别分析
Mar 03 PHP
PHP实现适用于自定义的验证码类
Jun 15 PHP
PHP设计模式之迭代器模式
Jun 17 PHP
阿里云PHP SMS短信服务验证码发送方法
Jul 11 PHP
详谈PHP中public,private,protected,abstract等关键字的用法
Dec 31 PHP
php JWT在web端中的使用方法教程
Sep 06 PHP
php输出控制函数和输出函数生成静态页面
Jun 27 PHP
PHP操作XML中XPath的应用示例
Jul 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
支持数组的ADDSLASHES的php函数
2010/02/16 PHP
for循环连续求和、九九乘法表代码
2012/02/20 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
2019/09/30 PHP
SWFObject Flash js调用类
2008/07/08 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
jQuery获取地址栏参数插件(模仿C#)
2010/10/26 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
《JavaScript DOM 编程艺术》读书笔记之JavaScript 简史
2015/01/09 Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
2016/08/02 Javascript
总结Javascript中数组各种去重的方法
2016/10/04 Javascript
基于vue 实现token验证的实例代码
2017/12/14 Javascript
Angular数据绑定机制原理
2018/04/17 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
vue 设置路由的登录权限的方法
2018/07/03 Javascript
js实现黑白div块画空心的图形
2018/12/13 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
mock.js模拟前后台交互
2019/07/25 Javascript
Vue中通过Vue.extend动态创建实例的方法
2019/08/13 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
JS实现手写 forEach算法示例
2020/04/29 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
2020/05/09 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
[53:10]Secret vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
下载给定网页上图片的方法
2014/02/18 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Python @property装饰器原理解析
2020/01/22 Python
css sprite简单实例
2016/05/23 HTML / CSS
Scholastic父母商店:儿童书籍
2017/01/01 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
电视购物广告词
2014/03/19 职场文书
寒假家长评语大全
2014/04/16 职场文书
服装发布会策划方案
2014/05/22 职场文书
真诚的求职信
2014/07/04 职场文书
党员学习新党章思想汇报
2014/10/25 职场文书
2016春季小学开学寄语
2015/12/03 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript