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中路径问题的解决方案
Oct 09 PHP
也谈截取首页新闻 - 范例
Oct 09 PHP
推荐个功能齐全的发送PHP邮件类
Jan 03 PHP
php 远程关机操作的代码
Dec 05 PHP
PHP Pear 安装及使用
Mar 19 PHP
php empty函数判断mysql表单是否为空
Apr 12 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
php通过记录IP来防止表单重复提交方法分析
Dec 16 PHP
PHP实现查询两个数组中不同元素的方法
Feb 23 PHP
YII Framework框架教程之安全方案详解
Mar 14 PHP
php常用字符串String函数实例总结【转换,替换,计算,截取,加密】
Dec 07 PHP
PHP两个n位的二进制整数相加问题的解决
Aug 26 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
解决windows上php xdebug 无法调试的问题
2020/02/19 PHP
javascript Xml增删改查(IE下)操作实现代码
2009/01/30 Javascript
jQuery EasyUI API 中文文档 - ComboBox组合框
2011/10/07 Javascript
js实现编辑div节点名称的方法
2014/12/17 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
Js与Jq获取浏览器和对象值的方法
2016/03/18 Javascript
js移动焦点到最后位置的简单方法
2016/11/25 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
JavaScript中常见内置函数用法示例
2018/05/14 Javascript
JS加密插件CryptoJS实现AES加密操作示例
2018/08/16 Javascript
vue-cli 脚手架基于Nightwatch的端到端测试环境的过程
2018/09/30 Javascript
python实现迭代法求方程组的根过程解析
2019/11/25 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
[02:32]DOTA2英雄基础教程 祸乱之源
2013/12/23 DOTA
Ubuntu下安装PyV8
2016/03/13 Python
用yum安装MySQLdb模块的步骤方法
2016/12/15 Python
python3利用venv配置虚拟环境及过程中的小问题小结
2018/08/01 Python
浅谈python常用程序算法
2019/03/22 Python
详解Python locals()的陷阱
2019/03/26 Python
Python callable内置函数原理解析
2020/03/05 Python
Softmax函数原理及Python实现过程解析
2020/05/22 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
无惧面试,带你搞懂python 装饰器
2020/08/17 Python
python3 使用ssh隧道连接mysql的操作
2020/12/05 Python
利用CSS3的flexbox实现水平垂直居中与三列等高布局
2016/09/12 HTML / CSS
HTML5 声明兼容IE的写法
2011/05/16 HTML / CSS
Html5 Geolocation获取地理位置信息实例
2016/12/09 HTML / CSS
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
Zavvi西班牙:电子游戏、极客服装、Blu-ray、Funko Pop等
2019/05/03 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
旅游项目开发策划书
2014/01/18 职场文书
工程专业应届生求职信
2014/02/19 职场文书
班主任经验交流心得体会
2015/11/02 职场文书
2016年度基层党建工作公开承诺书
2016/03/25 职场文书
大学学生会主席竞选稿怎么写?
2019/08/19 职场文书
新手入门Jvm-- JVM对象创建与内存分配机制
2021/06/18 Java/Android