温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

php如何实现压缩合并js

发布时间:2021-06-25 10:40:16 来源:亿速云 阅读:237 作者:小新 栏目:开发技术

这篇文章主要介绍了php如何实现压缩合并js,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

具体如下:

test.php文件如下:

require_once('jsmin.php'); $files = glob("js/*.js"); $js = ""; foreach($files as $file) {   $js .= JSMin::minify(file_get_contents($file)); } file_put_contents("combined.js", $js); echo "success";

jsmin.php文件如下:

<?php /**  * jsmin.php - PHP implementation of Douglas Crockford's JSMin.  *  * This is pretty much a direct port of jsmin.c to PHP with just a few  * PHP-specific performance tweaks. Also, whereas jsmin.c reads from stdin and  * outputs to stdout, this library accepts a string as input and returns another  * string as output.  *  * PHP 5 or higher is required.  *  * Permission is hereby granted to use this version of the library under the  * same terms as jsmin.c, which has the following license:  *  * --  * Copyright (c) 2002 Douglas Crockford (www.crockford.com)  *  * Permission is hereby granted, free of charge, to any person obtaining a copy of  * this software and associated documentation files (the "Software"), to deal in  * the Software without restriction, including without limitation the rights to  * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies  * of the Software, and to permit persons to whom the Software is furnished to do  * so, subject to the following conditions:  *  * The above copyright notice and this permission notice shall be included in all  * copies or substantial portions of the Software.  *  * The Software shall be used for Good, not Evil.  *  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE  * SOFTWARE.  * --  *  * @package JSMin  * @author Ryan Grove <ryan@wonko.com>  * @copyright 2002 Douglas Crockford <douglas@crockford.com> (jsmin.c)  * @copyright 2008 Ryan Grove <ryan@wonko.com> (PHP port)  * @copyright 2012 Adam Goforth <aag@adamgoforth.com> (Updates)  * @license http://opensource.org/licenses/mit-license.php MIT License  * @version 1.1.2 (2012-05-01)  * @link https://github.com/rgrove/jsmin-php  */ class JSMin {  const ORD_LF      = 10;  const ORD_SPACE     = 32;  const ACTION_KEEP_A   = 1;  const ACTION_DELETE_A  = 2;  const ACTION_DELETE_A_B = 3;  protected $a      = '';  protected $b      = '';  protected $input    = '';  protected $inputIndex = 0;  protected $inputLength = 0;  protected $lookAhead  = null;  protected $output   = '';  // -- Public Static Methods --------------------------------------------------  /**   * Minify Javascript   *   * @uses __construct()   * @uses min()   * @param string $js Javascript to be minified   * @return string   */  public static function minify($js) {   $jsmin = new JSMin($js);   return $jsmin->min();  }  // -- Public Instance Methods ------------------------------------------------  /**   * Constructor   *   * @param string $input Javascript to be minified   */  public function __construct($input) {   $this->input    = str_replace("\r\n", "\n", $input);   $this->inputLength = strlen($this->input);  }  // -- Protected Instance Methods ---------------------------------------------  /**   * Action -- do something! What to do is determined by the $command argument.   *   * action treats a string as a single character. Wow!   * action recognizes a regular expression if it is preceded by ( or , or =.   *   * @uses next()   * @uses get()   * @throws JSMinException If parser errors are found:   *     - Unterminated string literal   *     - Unterminated regular expression set in regex literal   *     - Unterminated regular expression literal   * @param int $command One of class constants:   *   ACTION_KEEP_A   Output A. Copy B to A. Get the next B.   *   ACTION_DELETE_A  Copy B to A. Get the next B. (Delete A).   *   ACTION_DELETE_A_B Get the next B. (Delete B).  */  protected function action($command) {   switch($command) {    case self::ACTION_KEEP_A:     $this->output .= $this->a;    case self::ACTION_DELETE_A:     $this->a = $this->b;     if ($this->a === "'" || $this->a === '"') {      for (;;) {       $this->output .= $this->a;       $this->a    = $this->get();       if ($this->a === $this->b) {        break;       }       if (ord($this->a) <= self::ORD_LF) {        throw new JSMinException('Unterminated string literal.');       }       if ($this->a === '\\') {        $this->output .= $this->a;        $this->a    = $this->get();       }      }     }    case self::ACTION_DELETE_A_B:     $this->b = $this->next();     if ($this->b === '/' && (       $this->a === '(' || $this->a === ',' || $this->a === '=' ||       $this->a === ':' || $this->a === '[' || $this->a === '!' ||       $this->a === '&' || $this->a === '|' || $this->a === '?' ||       $this->a === '{' || $this->a === '}' || $this->a === ';' ||       $this->a === "\n" )) {      $this->output .= $this->a . $this->b;      for (;;) {       $this->a = $this->get();       if ($this->a === '[') {        /*         inside a regex [...] set, which MAY contain a '/' itself. Example: mootools Form.Validator near line 460:          return Form.Validator.getValidator('IsEmpty').test(element) || (/^(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]\.?){0,63}[a-z0-9!#$%&'*+/=?^_`{|}~-]@(?:(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)*[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\])$/i).test(element.get('value'));        */        for (;;) {         $this->output .= $this->a;         $this->a = $this->get();         if ($this->a === ']') {           break;         } elseif ($this->a === '\\') {          $this->output .= $this->a;          $this->a    = $this->get();         } elseif (ord($this->a) <= self::ORD_LF) {          throw new JSMinException('Unterminated regular expression set in regex literal.');         }        }       } elseif ($this->a === '/') {        break;       } elseif ($this->a === '\\') {        $this->output .= $this->a;        $this->a    = $this->get();       } elseif (ord($this->a) <= self::ORD_LF) {        throw new JSMinException('Unterminated regular expression literal.');       }       $this->output .= $this->a;      }      $this->b = $this->next();     }   }  }  /**   * Get next char. Convert ctrl char to space.   *   * @return string|null   */  protected function get() {   $c = $this->lookAhead;   $this->lookAhead = null;   if ($c === null) {    if ($this->inputIndex < $this->inputLength) {     $c = substr($this->input, $this->inputIndex, 1);     $this->inputIndex += 1;    } else {     $c = null;    }   }   if ($c === "\r") {    return "\n";   }   if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) {    return $c;   }   return ' ';  }  /**   * Is $c a letter, digit, underscore, dollar sign, or non-ASCII character.   *   * @return bool   */  protected function isAlphaNum($c) {   return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1;  }  /**   * Perform minification, return result   *   * @uses action()   * @uses isAlphaNum()   * @uses get()   * @uses peek()   * @return string   */  protected function min() {   if (0 == strncmp($this->peek(), "\xef", 1)) {     $this->get();     $this->get();     $this->get();   }    $this->a = "\n";   $this->action(self::ACTION_DELETE_A_B);   while ($this->a !== null) {    switch ($this->a) {     case ' ':      if ($this->isAlphaNum($this->b)) {       $this->action(self::ACTION_KEEP_A);      } else {       $this->action(self::ACTION_DELETE_A);      }      break;     case "\n":      switch ($this->b) {       case '{':       case '[':       case '(':       case '+':       case '-':       case '!':       case '~':        $this->action(self::ACTION_KEEP_A);        break;       case ' ':        $this->action(self::ACTION_DELETE_A_B);        break;       default:        if ($this->isAlphaNum($this->b)) {         $this->action(self::ACTION_KEEP_A);        }        else {         $this->action(self::ACTION_DELETE_A);        }      }      break;     default:      switch ($this->b) {       case ' ':        if ($this->isAlphaNum($this->a)) {         $this->action(self::ACTION_KEEP_A);         break;        }        $this->action(self::ACTION_DELETE_A_B);        break;       case "\n":        switch ($this->a) {         case '}':         case ']':         case ')':         case '+':         case '-':         case '"':         case "'":          $this->action(self::ACTION_KEEP_A);          break;         default:          if ($this->isAlphaNum($this->a)) {           $this->action(self::ACTION_KEEP_A);          }          else {           $this->action(self::ACTION_DELETE_A_B);          }        }        break;       default:        $this->action(self::ACTION_KEEP_A);        break;      }    }   }   return $this->output;  }  /**   * Get the next character, skipping over comments. peek() is used to see   * if a '/' is followed by a '/' or '*'.   *   * @uses get()   * @uses peek()   * @throws JSMinException On unterminated comment.   * @return string   */  protected function next() {   $c = $this->get();   if ($c === '/') {    switch($this->peek()) {     case '/':      for (;;) {       $c = $this->get();       if (ord($c) <= self::ORD_LF) {        return $c;       }      }     case '*':      $this->get();      for (;;) {       switch($this->get()) {        case '*':         if ($this->peek() === '/') {          $this->get();          return ' ';         }         break;        case null:         throw new JSMinException('Unterminated comment.');       }      }     default:      return $c;    }   }   return $c;  }  /**   * Get next char. If is ctrl character, translate to a space or newline.   *   * @uses get()   * @return string|null   */  protected function peek() {   $this->lookAhead = $this->get();   return $this->lookAhead;  } } // -- Exceptions --------------------------------------------------------------- class JSMinException extends Exception {} ?>

感谢你能够认真阅读完这篇文章,希望小编分享的“php如何实现压缩合并js”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI