HP自动检查html标签是否闭合
function HtmlClose($body) {
$strlen_var = strlen($body);
// 不包含 html 标签
if (strpos($body, '<') === false) {
return $body;
}
// html 代码标记
$html_tag = 0;
// 摘要字符串
$summary_string = '';
/**
* 数组用作记录摘要范围内出现的 html 标签
* 开始和结束分别保存在 left 和 right 键名下
* 如字符串为:<h3><p><b>a</b></h3>,假设 p 未闭合
* 数组则为:array('left' => array('h3', 'p', 'b'), 'right' => 'b', 'h3');
* 仅补全 html 标签,<? <% 等其它语言标记,会产生不可预知结果
*/
$html_array = array('left' => array(), 'right' => array());
for ($i = 0; $i < $strlen_var; ++$i) {
$current_var = substr($body, $i, 1);
if ($current_var == '<') {
// html 代码开始
$html_tag = 1;
$html_array_str = '';
} else if ($html_tag == 1) {
// 一段 html 代码结束
if ($current_var == '>') {
/**
* 去除首尾空格,如 <br / > < img src="" / > 等可能出现首尾空格
*/
$html_array_str = trim($html_array_str);
/**
* 判断最后一个字符是否为 /,若是,则标签已闭合,不记录
*/
if (substr($html_array_str, -1) != '/') {
// 判断第一个字符是否 /,若是,则放在 right 单元
$f = substr($html_array_str, 0, 1);
if ($f == '/') {
// 去掉 /
$html_array['right'][] = str_replace('/', '', $html_array_str);
} else if ($f != '?') {
// 判断是否为 ?,若是,则为 PHP 代码,跳过
/**
* 判断是否有半角空格,若有,以空格分割,第一个单元为 html 标签
* 如 <h2 class="a"> <p class="a">
*/
if (strpos($html_array_str, ' ') !== false) {
// 分割成2个单元,可能有多个空格,如:<h2 class="" id="">
$html_array['left'][] = strtolower(current(explode(' ', $html_array_str, 2)));
} else {
/**
* * 若没有空格,整个字符串为 html 标签,如:<b> <p> 等
* 统一转换为小写
*/
$html_array['left'][] = strtolower($html_array_str);
}
}
}
// 字符串重置
$html_array_str = '';
$html_tag = 0;
} else {
/**
* 将< >之间的字符组成一个字符串
* 用于提取 html 标签
*/
$html_array_str .= $current_var;
}
} else {
// 非 html 代码才记数
--$size;
}
$ord_var_c = ord($body{$i});
switch (true) {
case (($ord_var_c & 0xE0) == 0xC0):
// 2 字节
$summary_string .= substr($body, $i, 2);
$i += 1;
break;
case (($ord_var_c & 0xF0) == 0xE0):
// 3 字节
$summary_string .= substr($body, $i, 3);
$i += 2;
break;
case (($ord_var_c & 0xF8) == 0xF0):
// 4 字节
$summary_string .= substr($body, $i, 4);
$i += 3;
break;
case (($ord_var_c & 0xFC) == 0xF8):
// 5 字节
$summary_string .= substr($body, $i, 5);
$i += 4;
break;
case (($ord_var_c & 0xFE) == 0xFC):
// 6 字节
$summary_string .= substr($body, $i, 6);
$i += 5;
break;
default:
// 1 字节
$summary_string .= $current_var;
}
}
if ($html_array['left']) {
/**
* 比对左右 html 标签,不足则补全
*/
/**
* 交换 left 顺序,补充的顺序应与 html 出现的顺序相反
* 如待补全的字符串为:<h2>abc<b>abc<p>abc
* 补充顺序应为:</p></b></h2>
*/
$html_array['left'] = array_reverse($html_array['left']);
foreach ($html_array['left'] as $index => $tag) {
// 判断该标签是否出现在 right 中
$key = array_search($tag, $html_array['right']);
if ($key !== false) {
// 出现,从 right 中删除该单元
unset($html_array['right'][$key]);
} else {
// 没有出现,需要补全
$summary_string .= '</' . $tag . '>';
}
}
}
return $summary_string;
}
网页截取字符串出现乱码:
function sub($str,$start,$len) {//$str是指字符串,$start指字符串的起始位置,$len指字符串长度
$len=$len*3;
$strlen=$start+$len; //用$strlen存储字符串的总长度
$tmpstr='';
for($i=0;$i<$strlen;$i++) {
if(ord(substr($str,$i,1))>0xa0) { //如果字符串中出现汉字,也就是ASC码大于0xa0的。作出判断与英文字符不一样。
$tmpstr.=mb_substr($str,$i,2,'utf-8');
//$tmpstr.=substr($str,$i,2);
$i++;
}
else
$tmpstr.=mb_substr($str,$i,1,'utf-8');
}
return $tmpstr;
}
HP自动检查html标签是否闭合的更多相关文章
- div标签的闭合检查
什么叫DIV标签有没有闭合呢?有<div>开头就应该有</div>来结尾闭合了.有时候写代码写 了<div>,忘记</div>结尾,谓之没有闭合也. 如 ...
- 自闭合标签-主动闭合标签-meta-link标签
<!DOCTYPE html><!--规定标准的html--><!--一个页在只有一对html标签--><!--标签的属性 指定英文--><htm ...
- sublime text3中使用Emmet部分标签无法闭合
转载自:http://geek100.com/2490/ 不过很早就发现br,input, img在sublime text中是没有闭合标签 / 的. 我一般都是手动补上的, 今天突然想起这个问题, ...
- vscode 使用ESLint 自动检查,保存时自动格式化
1:全局安装eslint `npm install -g eslint`2: 打开vscode 点击 “文件”----->“首选项”---->“设置”,在右侧“用户设置/settings. ...
- 关于angularJS绑定数据时自动转义html标签
关于angularJS绑定数据时自动转义html标签 angularJS在进行数据绑定时默认是会以文本的形式输出,也就是对你数据中的html标签不进行转义照单全收,这样提高了安全性,防止了html标签 ...
- Windows批处理:自动检查服务器连通性
该技术与上一篇<自动检查网络连通性>的实现原理相同,我将脚本稍微改动了下,用于检查公司服务器的连通性,简单快捷.在这里附上修改方法. @echo off color 1F title 服务 ...
- 关于thinkphp 中的字段自动检查机制
在thinkphp中有很好用的自动检查机制$_validate() 但是必须与create接收配合使用 可以很方便的帮助我们去判断 namespace Home\Model;use Think\Mod ...
- 推荐一款超强大的基于Angularjs的自动完成(Autocomplete)标签及标签组插件–ngTagsInput
前言 今天利用中午午休时间,给大家分享推荐一款基于Angularjs的自动完成(Autocomplete)标签及标签组插件--ngTagsInput,功能超强大的.不信,你试试就知道^_^... Au ...
- 百度编辑器解决span被过滤, 自动加P标签
editor_all.js: 自动加P标签去除: enterTag: 'p', 改成: enterTag: '', span被过滤: //从编辑器出去的内容处理 me.addOutputR ...
随机推荐
- js push
$('.main_div').each(function(){ product_id = parseInt($(this).data('id')); product_num = parseInt($( ...
- zoj 1729 Hidden Password
Hidden Passwordhttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=729 Time Limit: 2 Seconds ...
- Spring Security 过滤器链
Alias Filter Class Namespace Element or Attribute CHANNEL_FILTER ChannelProcessingFilter http/interc ...
- .NET RabbitMQ
在企业应用系统领域,会面对不同系统之间的通信.集成与整合,尤其当面临异构系统时,这 种分布式的调用与通信变得越发重要.其次,系统中一般会有很多对实时性要求不高的但是执行起来比较较耗时的地方,比如发送短 ...
- Item 11 谨慎地覆盖Clone
1.进行浅拷贝时,只是复制原始数据类型的值,则可以通过覆盖Clone方法来达到.另外,在进行浅拷贝的时候,还要注意,成员对象中不应该要有引用类型,如果有引用类型,那么,进行了浅拷贝之后,两个对象将会共 ...
- vue 点击选中改变样式
data里isActive:-1,method里 checkedItem(index){ this.isActive=index;},页面里 <div v-for="(item,ind ...
- Bower A package manager for the web
Bower can manage components that contain HTML, CSS, JavaScript, fonts or even image files. Bower doe ...
- Android Studio注意事项
http://www.android-studio.org/ 解决方法: 在 Android Studio 安装目录 bin/idea.properties 文件最后追加一句 1 disable.an ...
- Java多线程学习(五)线程间通信知识点补充
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- Caffe 学习笔记1
Caffe 学习笔记1 本文为原创作品,未经本人同意,禁止转载,禁止用于商业用途!本人对博客使用拥有最终解释权 欢迎关注我的博客:http://blog.csdn.net/hit2015spring和 ...