Yii2压缩PHP中模板代码的输出问题


Posted in PHP onAugust 28, 2018

在Web开发中,无论是PHP的框架还是Python的框架,都会遇到使用模板的时候,在使用模板的时候就会遇到一个问题,就是使用模板编写的代码通过查看源代码的时候,会发现代码混乱不堪,对于代码格式又嫉妒追求的我来说我因受不了,但是目前也没有找到什么好的格式化输出的办法

但是格式化输出的话,也会需要处理一个压缩的问题,最终还是选择一个方案,开发的时候为了查看代码修改代码,就不做处理,但是上线的时候还是要做下压缩的处理,就是将无用的空格或者换行之类的全部删除掉。

问题前提已经抛出,现在看看如何解决这个问题,为了防止重复早轮子网上也查了一遍,结果也找到了,但是用composer安装的时候又是各种的不兼容,于是看了下源代码,其实很简单。这里我就简答的说下如何使用

具体的逻辑我就不多说了,其实自己理解了下面的使用流程,自己改写也不是太难的事情

第一步 功能开发

创建两个文件一个是components/HtmlMinify.php,代码逻辑如下

<?php
namespace app\components;
use app\helpers\HtmlMinifyHelper;
use Yii;
use yii\base\Component;
use yii\base\Event;
use yii\web\Response;
use yii\web\View;
class HtmlMinify extends Component
{
 /**
  * Minify html. Process before response send
  * @var bool
  */
 public $html = false;
 /**
  * Minify css on page, added by registerCss. Process before render page in view component
  * @var bool
  */
 public $css = false;
 /**
  * Minify css on page. Process before render page in view component
  * @var bool
  */
 public $js = false;
 /**
  * Response formats list, where enable minify html
  * @var array
  */
 public $formats = [
  Response::FORMAT_HTML,
 ];
 public function init()
 {
  /** @var $this View */
  Yii::$app->view->on(View::EVENT_END_PAGE, [$this, 'onEventEndPage']);
  Yii::$app->response->on(Response::EVENT_BEFORE_SEND, [$this, 'onEventBeforeSend']);
 }
 public function onEventEndPage(Event $event)
 {
  $view = $event->sender;
  if ($this->css && !empty($view->css)) {
   foreach ($view->css as &$css) {
    $css = HtmlMinifyHelper::css($css);
   }
  }
  if ($this->js && !empty($view->js)) {
   foreach ($view->js as &$list) {
    foreach ($list as &$js) {
     $js = HtmlMinifyHelper::js($js);
    }
   }
  }
 }
 public function onEventBeforeSend(Event $event)
 {
  $response = $event->sender;
  if ($this->html & in_array($response->format, $this->formats)) {
   if (!empty($response->data)) {
    $response->data = HtmlMinifyHelper::html($response->data);
   }
   if (!empty($response->content)) {
    $response->content = HtmlMinifyHelper::html($response->content);
   }
  }
 }
}

另外一个文件上是helpers/HtmlMinifyHelper.php,代码逻辑如下

<?php
namespace app\helpers;
class HtmlMinifyHelper
{
 public static function html($input)
 {
  if (trim($input) === "") {
   return $input;
  }
  // Remove extra white-space(s) between HTML attribute(s)
  $input = preg_replace_callback('#<([^\/\s<>!]+)(?:\s+([^<>]*?)\s*|\s*)(\/?)>#s', function ($matches) {
   return '<' . $matches[1] . preg_replace('#([^\s=]+)(\=([\'"]?)(.*?)\3)?(\s+|$)#s', ' $1$2', $matches[2]) . $matches[3] . '>';
  }, str_replace("\r", "", $input));
  // Minify inline CSS declaration(s)
  if (strpos($input, ' style=') !==false){   $input=preg_replace_callback('#<([^<]+?)\s+style=([\'"])(.*?)\2(?=[\/\s>])#s',function ($matches){    return '<' . $matches[1] . ' style=' . $matches[2] . self::css($matches[3]) . $matches[2];
   }, $input);
  }
  return preg_replace(
   [
    // t = text
    // o = tag open
    // c = tag close
    // Keep important white-space(s) after self-closing HTML tag(s)
    '#<(img|input)(>| .*?>)#s',
    // Remove a line break and two or more white-space(s) between tag(s)
    '#(<!--.*?-->)|(>)(?:\n*|\s{2,})(<)|^\s*|\s*$#s',
    '#(<!--.*?-->)|(?<!\>)\s+(<\/.*?>)|(<[^\/]*?>)\s+(?!\<)#s', // t+c || o+t
    '#(<!--.*?-->)|(<[^\/]*?>)\s+(<[^\/]*?>)|(<\/.*?>)\s+(<\/.*?>)#s', // o+o || c+c
    '#(<!--.*?-->)|(<\/.*?>)\s+(\s)(?!\<)|(?<!\>)\s+(\s)(<[^\/]*?\/?>)|(<[^\/]*?\/?>)\s+(\s)(?!\<)#s', // c+t || t+o || o+t -- separated by long white-space(s)
    '#(<!--.*?-->)|(<[^\/]*?>)\s+(<\/.*?>)#s', // empty tag
    '#<(img|input)(>| .*?>)<\/\1>#s', // reset previous fix
    '#( ) (?![<\s])#', // clean up ...
    '#(?<=\>)( )(?=\<)#', // --ibid
    // Remove HTML comment(s) except IE comment(s)
    '#\s*<!--(?!\[if\s).*?-->\s*|(?<!\>)\n+(?=\<[^!])#s',
   ],
   [
    '<$1$2</$1>',
    '$1$2$3',
    '$1$2$3',
    '$1$2$3$4$5',
    '$1$2$3$4$5$6$7',
    '$1$2$3',
    '<$1$2',
    '$1 ',
    '$1',
    "",
   ],
   $input);
 }
 public static function css($input)
 {
  if (trim($input) === "") {
   return $input;
  }
  return preg_replace(
   [
    // Remove comment(s)
    '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')|\/\*(?!\!)(?>.*?\*\/)|^\s*|\s*$#s',
    // Remove unused white-space(s)
    '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/))|\s*+;\s*+(})\s*+|\s*+([*$~^|]?+=|[{};,>~+]|\s*+-(?![0-9\.])|!important\b)\s*+|([[(:])\s++|\s++([])])|\s++(:)\s*+(?!(?>[^{}"\']++|"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')*+{)|^\s++|\s++\z|(\s)\s+#si',
    // Replace `0(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)` with `0`
    '#(?<=[\s:])(0)(cm|em|ex|in|mm|pc|pt|px|vh|vw|%)#si',
    // Replace `:0 0 0 0` with `:0`
    '#:(0\s+0|0\s+0\s+0\s+0)(?=[;\}]|\!important)#i',
    // Replace `background-position:0` with `background-position:0 0`
    '#(background-position):0(?=[;\}])#si',
    // Replace `0.6` with `.6`, but only when preceded by `:`, `,`, `-` or a white-space
    '#(?<=[\s:,\-])0+\.(\d+)#s',
    // Minify string value
    '#(\/\*(?>.*?\*\/))|(?<!content\:)([\'"])([a-z_][a-z0-9\-_]*?)\2(?=[\s\{\}\];,])#si',
    '#(\/\*(?>.*?\*\/))|(\burl\()([\'"])([^\s]+?)\3(\))#si',
    // Minify HEX color code
    '#(?<=[\s:,\-]\#)([a-f0-6]+)\1([a-f0-6]+)\2([a-f0-6]+)\3#i',
    // Replace `(border|outline):none` with `(border|outline):0`
    '#(?<=[\{;])(border|outline):none(?=[;\}\!])#',
    // Remove empty selector(s)
    '#(\/\*(?>.*?\*\/))|(^|[\{\}])(?:[^\s\{\}]+)\{\}#s',
   ],
   [
    '$1',
    '$1$2$3$4$5$6$7',
    '$1',
    ':0',
    '$1:0 0',
    '.$1',
    '$1$3',
    '$1$2$4$5',
    '$1$2$3',
    '$1:0',
    '$1$2',
   ],
   $input);
 }
 public static function js($input)
 {
  if (trim($input) === "") {
   return $input;
  }
  return preg_replace(
   [
    // Remove comment(s)
    '#\s*("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\')\s*|\s*\/\*(?!\!|@cc_on)(?>[\s\S]*?\*\/)\s*|\s*(?<![\:\=])\/\/.*(?=[\n\r]|$)|^\s*|\s*$#',
    // Remove white-space(s) outside the string and regex
    '#("(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'|\/\*(?>.*?\*\/)|\/(?!\/)[^\n\r]*?\/(?=[\s.,;]|[gimuy]|$))|\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#s',
    // Remove the last semicolon
    '#;+\}#',
    // Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}`
    '#([\{,])([\'])(\d+|[a-z_][a-z0-9_]*)\2(?=\:)#i',
    // --ibid. From `foo['bar']` to `foo.bar`
    '#([a-z0-9_\)\]])\[([\'"])([a-z_][a-z0-9_]*)\2\]#i',
   ],
   [
    '$1',
    '$1$2',
    '}',
    '$1$3',
    '$1.$3',
   ],
   $input);
 }
}

第二步 功能配置

修改配置文件文件,这里修改config/web.php

components中加入如下代码

'htmlMinify' => [
 'class' => 'app\components\HtmlMinify',
 'html' => !YII_ENV_DEV, // 这里只开启了html的
],

在bootstrap中加入如下代码

'bootstrap' => ['log', 'htmlMinify'], // log是默认加的, htmlMinify是我们自己加的

到这里就结束了配置可以试着在生产环境试下

总结

以上所述是小编给大家介绍的Yii2压缩PHP中模板代码的输出问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

PHP 相关文章推荐
php设计模式  Command(命令模式)
Jun 17 PHP
PHP数据类型之整数类型、浮点数的介绍
Apr 28 PHP
基于PHP常用字符串的总结(待续)
Jun 07 PHP
解析web文件操作常见安全漏洞(目录、文件名检测漏洞)
Jun 29 PHP
PHP+jQuery 注册模块开发详解
Oct 14 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
Yii2中事务的使用实例代码详解
Sep 07 PHP
PHP基于方差和标准差计算学生成绩的稳定性示例
Jul 04 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP实现的猴王算法(猴子选大王)示例
Apr 30 PHP
实例讲解PHP验证邮箱是否合格
Jan 28 PHP
PHP MVC框架中类的自动加载机制实例分析
Sep 18 PHP
PHP实现的XXTEA加密解密算法示例
Aug 28 #PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 #PHP
PHP连接sftp并下载文件的方法教程
Aug 26 #PHP
PHP操作Redis数据库常用方法示例
Aug 25 #PHP
PHP实现基于3DES算法加密解密字符串示例
Aug 24 #PHP
PHP与以太坊交互详解
Aug 24 #PHP
php获取微信基础接口凭证Access_token
Aug 23 #PHP
You might like
利用discuz自带通行证整合dedecms的方法以及文件下载
2007/03/06 PHP
PHP 如何利用phpexcel导入数据库
2013/08/24 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
2016/09/09 PHP
js对象基础实例分析
2015/01/13 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
Javascript中For In语句用法实例
2015/05/14 Javascript
JS基于cookie实现来宾统计记录访客信息的方法
2015/08/04 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
Nuxt.js实现校验访问浏览器类型的中间件
2018/08/24 Javascript
Vue核心概念Getter的使用方法
2019/01/18 Javascript
JS数组方法reduce的用法实例分析
2020/03/03 Javascript
[16:56]heroes英雄教学 司夜刺客
2014/09/18 DOTA
[42:39]老党炸弹人试玩视频
2014/09/03 DOTA
[01:38]DOTA2辉夜杯 欢乐的观众现场采访
2015/12/26 DOTA
[40:48]DOTA2上海特级锦标赛D组败者赛 Liquid VS COL第二局
2016/02/28 DOTA
基于python爬虫数据处理(详解)
2017/06/10 Python
解读! Python在人工智能中的作用
2017/11/14 Python
Python re 模块findall() 函数返回值展现方式解析
2019/08/09 Python
python实现kNN算法识别手写体数字的示例代码
2019/08/16 Python
Python爬虫:url中带字典列表参数的编码转换方法
2019/08/21 Python
Python集合操作方法详解
2020/02/09 Python
基于HTML5的WebSocket的实例代码
2018/08/15 HTML / CSS
魔声耳机官方网站:Monster是世界第一品牌的高性能耳机
2016/10/26 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
送给程序员的20个Java集合面试问题
2014/08/06 面试题
迷你西餐厅创业计划书范文
2013/12/31 职场文书
爱岗敬业演讲稿
2014/05/05 职场文书
食堂标语大全
2014/06/11 职场文书
自我管理的活动方案
2014/08/25 职场文书
2015商场元旦促销活动策划方案
2014/12/09 职场文书
经理岗位职责
2015/02/02 职场文书
中学生学习保证书
2015/02/26 职场文书
董事长助理工作总结2015
2015/07/23 职场文书
致创业您:正能量激励人心句子(48条)
2019/08/15 职场文书
Python获取字典中某个key的value
2022/04/13 Python