热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP压缩HTML-使用正则安全的压缩-PHP源码

分析HTML代码HTML一般包括以下的部分:标签,以包裹文档声明、注释等格式半开标签闭合标签内容,非以包裹,这一部分内容中多空格是无效果的PHP正则分解html代码html代码是以标签为界限的,所以,

分析HTML代码

HTML一般包括以下的部分:

标签,以<>包裹

文档声明、注释等格式

半开标签<..../>

闭合标签

内容,非以<>包裹,这一部分内容中多空格是无效果的

PHP正则分解html代码

html代码是以标签为界限的,所以,只要按标签分解就可以了。在PHP中使用preg_split:

$segments = preg_split("/(<[^>]+?>)/si",$html, null,PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE);

例如,以下的代码

$html = <<

    
    
    


文章RSS 网站地图 日期归档 标签归档

关注WEB,体悟生活;珍惜生命,远离代码。

HTML; print_r(preg_split("/(<[^>]+?>)/si",$html, -1,PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE));

会产生如下的输出:

Array
(
    [0] => 
    [1] => 
    [2] => 
    [3] => 
    [4] => 
    [5] => 
    [6] => 
    [9] => 
    [10] => 
    [11] => 
    [12] => 
    [13] => 
    [14] => 
    [15] =>
    [16] => 
    [17] => 
    [18] => 

[19] => [20] => [21] => 文章RSS [22] => [23] => [24] => [25] => 网站地图 [26] => [27] => [28] => [29] => 日期归档 [30] => [31] => [32] => [33] => 标签归档 [34] => [35] => [36] =>

[41] => [42] =>

[43] => 关注WEB,体悟生活;珍惜生命,远离代码。 [44] =>

[45] => [46] =>

[47] =>

[48] => [49] =>

[50] => [51] => [52] => [53] => )

最简单但有损的PHP压缩

最简单的压缩就是直接连接所有的非空项,同时非标签去掉所有的空白:

$compressed = array();
foreach($segments as $seg)
{
    $seg = trim($seg);
    if($seg)
    {
        //非标签中的空白是无效的字符
        $compressed[] = $seg[0] === &#39;<&#39; ? $seg : preg_replace(&#39;!\s!&#39;,&#39;&#39;,$seg);
    }
}
return join(&#39;&#39;,$compress);

如以上的HTML通过这样的压缩生成的代码是(为了方便显示,我手动将它们断行了):


文章RSS 网站地图 日期归档 标签归档

关注WEB,体悟生活;珍惜生命,远离代码。

正常情况下这没错,但是也有“不正常”的情况:遇到不能去掉空白的内容时。比如script、code、pre、style是不可以去掉空白的,这时,就要使用栈进行压缩了:

使用栈进行安全压缩html

使用栈的规则是:<..>标签入栈,标签出栈,和<../>不理,但有一种可能的情况是,<../>不一定有结尾的反斜杠如:

都是可以的,这时就要特殊的处理这种情况:


    文章RSS
    网站地图
    日期归档
    标签归档
    
    

关注WEB,体悟生活;珍惜生命,远离代码。

    var say = "Hello world!";
    print say;
HTML; $segments = preg_split("/(<[^>]+?>)/si",$html, -1,PREG_SPLIT_NO_EMPTY| PREG_SPLIT_DELIM_CAPTURE); $compressed = array(); $stack = array(); $tag = &#39;&#39;; $half_open = array(&#39;meta&#39;,&#39;input&#39;,&#39;link&#39;,&#39;img&#39;,&#39;br&#39;); $cannot_compress = array(&#39;pre&#39;,&#39;code&#39;,&#39;script&#39;,&#39;style&#39;); foreach($segments as $seg) { if(trim($seg) === &#39;&#39;) { continue; } //<.../> if(preg_match("!<([a-z0-9]+)[^>]*?/>!si",$seg, $match)) { //$tag = self::format_tag($match[1]); format_tag($match[1]); $compressed[] = $seg; } else if(preg_match("!]*?>!si",$seg,$match))// { $tag = format_tag($match[1]); if(count($stack) > 0 && $stack[count($stack)-1] == $tag) { array_pop($stack); $compressed[] = $seg; } //这里再最好加一段判断,可以用于修复错误的html //... } else if(preg_match("!<([a-z0-9]+)[^>]*?>!si",$seg,$match))//<> { $tag = format_tag($match[1]); //半闭合标签不需要入栈,如
, if(!in_array($tag, $half_open)) { array_push($stack,$tag); } $compressed[] = $seg; } else if(preg_match("~]*>~", $seg)) { //文档声明和注释,注释也不能删除,如 $compressed[] = $seg; } else { $compressed[] = in_array($tag, $cannot_compress) ? $seg : preg_replace(&#39;!\s!&#39;, &#39;&#39;, $seg); } } function format_tag($tag) { return trim(strtolower($tag)); } echo join(&#39;&#39;,$compressed);

以上的代码产生如下的输出(为了方便显示,我手工断行了):

文章RSS 网站地图 日期归档 标签归档

关注WEB,体悟生活;珍惜生命,远离代码。

    var say = "Hello world!";
    print say;

最安全的HTML压缩

当然,以上的代码正确运行的基础是:HTML都是正确合法的,没有出现如等,但是在普通应用是没有问题的,如果需要安全的压缩HTML代码,可以使用HTML解析库进行修复并进行压缩

推荐阅读
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • Java验证码——kaptcha的使用配置及样式
    本文介绍了如何使用kaptcha库来实现Java验证码的配置和样式设置,包括pom.xml的依赖配置和web.xml中servlet的配置。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 本文介绍了使用cacti监控mssql 2005运行资源情况的操作步骤,包括安装必要的工具和驱动,测试mssql的连接,配置监控脚本等。通过php连接mssql来获取SQL 2005性能计算器的值,实现对mssql的监控。详细的操作步骤和代码请参考附件。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • CEPH LIO iSCSI Gateway及其使用参考文档
    本文介绍了CEPH LIO iSCSI Gateway以及使用该网关的参考文档,包括Ceph Block Device、CEPH ISCSI GATEWAY、USING AN ISCSI GATEWAY等。同时提供了多个参考链接,详细介绍了CEPH LIO iSCSI Gateway的配置和使用方法。 ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了一些Java开发项目管理工具及其配置教程,包括团队协同工具worktil,版本管理工具GitLab,自动化构建工具Jenkins,项目管理工具Maven和Maven私服Nexus,以及Mybatis的安装和代码自动生成工具。提供了相关链接供读者参考。 ... [详细]
author-avatar
深碍是碍u不是爱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有