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 相关文章推荐
php5中date()得出的时间为什么不是当前时间的解决方法
Jun 30 PHP
PHP获取网站域名和地址的代码
Aug 17 PHP
PHP中替换换行符的几种方法小结
Oct 15 PHP
php加密解密实用类分享
Jan 07 PHP
通过PHP简单实例介绍文件上传
Dec 16 PHP
PHP给文字内容中的关键字进行套红处理
Apr 12 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
cakephp常见知识点汇总
Feb 24 PHP
php读取出一个文件夹及其子文件夹下所有文件的方法示例
Jun 15 PHP
PHP排序算法之冒泡排序(Bubble Sort)实现方法详解
Apr 20 PHP
PHP join()函数用法与实例讲解
Mar 11 PHP
Laravel框架源码解析之入口文件原理分析
May 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
php 数组随机取值的简单实例
2016/05/23 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
js获取客户端外网ip的简单实例
2013/11/21 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
浅谈Javascript如何实现匀速运动
2014/12/19 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
js实现的页面矩阵图形变换特效
2016/01/26 Javascript
jquery配合.NET实现点击指定绑定数据并且能够一键下载
2016/10/28 Javascript
Angular页面间切换及传值的4种方法
2016/11/04 Javascript
JS实现点击网页判断是否安装app并打开否则跳转app store
2016/11/18 Javascript
微信小程序左滑删除效果的实现代码
2017/02/20 Javascript
vue.js的提示组件
2017/03/02 Javascript
jQuery实现base64前台加密解密功能详解
2017/08/29 jQuery
vue中component组件的props使用详解
2017/09/04 Javascript
详解Angular5 路由传参的3种方法
2018/04/28 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
微信小程序设置滚动条过程详解
2019/07/25 Javascript
vue cli3适配所有端方案的实现
2020/04/13 Javascript
Js on及addEventListener原理用法区别解析
2020/07/11 Javascript
JavaScript实现多球运动效果
2020/09/07 Javascript
python每次处理固定个数的字符的方法总结
2013/01/29 Python
python记录程序运行时间的三种方法
2017/07/14 Python
Python使用pip安装pySerial串口通讯模块
2018/04/20 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
墨西哥巴士车票在线购买:ClickBus
2018/03/27 全球购物
兰蔻法国官方网站:Lancôme法国
2020/02/22 全球购物
AOP的定义以及作用
2013/09/08 面试题
大学生职业生涯规划书模板
2014/01/03 职场文书
办理暂住证介绍信
2014/01/11 职场文书
化妆品促销方案
2014/02/24 职场文书
教师岗位聘任书范文
2014/03/29 职场文书
工作收入住址证明
2014/10/28 职场文书
2015年度优秀员工自荐书
2015/03/06 职场文书