1.代码
下面是JSMin类 * @copyright 2002 Douglas Crockford(jsmin.c) * @copyright 2008 Ryan Grove (PHP port) * @license http://opensource.org/licenses/mit-license.php MIT License * @version 1.1.1 (2008-03-02) * @link http://code.google.com/p/jsmin-php/ */ namespace Common\Extend; class JSMin { const ORD_LF = 10; const ORD_SPACE = 32; protected $a = &#39;&#39;; protected $b = &#39;&#39;; protected $input = &#39;&#39;; protected $inputIndex = 0; protected $inputLength = 0; protected $lookAhead = null; protected $output = &#39;&#39;; // -- Public Static Methods -------------------------------------------------- public static function minify($js) { $jsmin = new JSMin($js); return $jsmin->min(); } // -- Public Instance Methods ------------------------------------------------ public function __construct($input) { $this->input = str_replace("\r\n", "\n", $input); $this->inputLength = strlen($this->input); } // -- Protected Instance Methods --------------------------------------------- protected function action($d) { switch($d) { case 1: $this->output .= $this->a; case 2: $this->a = $this->b; if ($this->a === "&#39;" || $this->a === &#39;"&#39;) { 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(&#39;Unterminated string literal.&#39;); } if ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } } } case 3: $this->b = $this->next(); if ($this->b === &#39;/&#39; && ( $this->a === &#39;(&#39; || $this->a === &#39;,&#39; || $this->a === &#39;=&#39; || $this->a === &#39;:&#39; || $this->a === &#39;[&#39; || $this->a === &#39;!&#39; || $this->a === &#39;&&#39; || $this->a === &#39;|&#39; || $this->a === &#39;?&#39;)) { $this->output .= $this->a . $this->b; for (;;) { $this->a = $this->get(); if ($this->a === &#39;/&#39;) { break; } elseif ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } elseif (ord($this->a) <= self::ORD_LF) { throw new JSMinException(&#39;Unterminated regular expression &#39;. &#39;literal.&#39;); } $this->output .= $this->a; } $this->b = $this->next(); } } } protected function get() { $c = $this->lookAhead; $this->lookAhead = null; if ($c === null) { if ($this->inputIndex <$this->inputLength) { $c = $this->input[$this->inputIndex]; $this->inputIndex += 1; } else { $c = null; } } if ($c === "\r") { return "\n"; } if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { return $c; } return &#39; &#39;; } protected function isAlphaNum($c) { return ord($c) > 126 || $c === &#39;\\&#39; || preg_match(&#39;/^[\w\$]$/&#39;, $c) === 1; } protected function min() { $this->a = "\n"; $this->action(3); while ($this->a !== null) { switch ($this->a) { case &#39; &#39;: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } break; case "\n": switch ($this->b) { case &#39;{&#39;: case &#39;[&#39;: case &#39;(&#39;: case &#39;+&#39;: case &#39;-&#39;: $this->action(1); break; case &#39; &#39;: $this->action(3); break; default: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } } break; default: switch ($this->b) { case &#39; &#39;: if ($this->isAlphaNum($this->a)) { $this->action(1); break; } $this->action(3); break; case "\n": switch ($this->a) { case &#39;}&#39;: case &#39;]&#39;: case &#39;)&#39;: case &#39;+&#39;: case &#39;-&#39;: case &#39;"&#39;: case "&#39;": $this->action(1); break; default: if ($this->isAlphaNum($this->a)) { $this->action(1); } else { $this->action(3); } } break; default: $this->action(1); break; } } } return $this->output; } protected function next() { $c = $this->get(); if ($c === &#39;/&#39;) { switch($this->peek()) { case &#39;/&#39;: for (;;) { $c = $this->get(); if (ord($c) <= self::ORD_LF) { return $c; } } case &#39;*&#39;: $this->get(); for (;;) { switch($this->get()) { case &#39;*&#39;: if ($this->peek() === &#39;/&#39;) { $this->get(); return &#39; &#39;; } break; case null: throw new JSMinException(&#39;Unterminated comment.&#39;); } } default: return $c; } } return $c; } protected function peek() { $this->lookAhead = $this->get(); return $this->lookAhead; } } // -- Exceptions --------------------------------------------------------------- class JSMinException {} //class JSMinException extends Exception {} ?>
2.php代码
* @copyright 2002 Douglas Crockford(jsmin.c) * @copyright 2008 Ryan Grove (PHP port) * @license http://opensource.org/licenses/mit-license.php MIT License * @version 1.1.1 (2008-03-02) * @link http://code.google.com/p/jsmin-php/ */ namespace Common\Extend; class JSMin { const ORD_LF = 10; const ORD_SPACE = 32; protected $a = &#39;&#39;; protected $b = &#39;&#39;; protected $input = &#39;&#39;; protected $inputIndex = 0; protected $inputLength = 0; protected $lookAhead = null; protected $output = &#39;&#39;; // -- Public Static Methods -------------------------------------------------- public static function minify($js) { $jsmin = new JSMin($js); return $jsmin->min(); } // -- Public Instance Methods ------------------------------------------------ public function __construct($input) { $this->input = str_replace("\r\n", "\n", $input); $this->inputLength = strlen($this->input); } // -- Protected Instance Methods --------------------------------------------- protected function action($d) { switch($d) { case 1: $this->output .= $this->a; case 2: $this->a = $this->b; if ($this->a === "&#39;" || $this->a === &#39;"&#39;) { 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(&#39;Unterminated string literal.&#39;); } if ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } } } case 3: $this->b = $this->next(); if ($this->b === &#39;/&#39; && ( $this->a === &#39;(&#39; || $this->a === &#39;,&#39; || $this->a === &#39;=&#39; || $this->a === &#39;:&#39; || $this->a === &#39;[&#39; || $this->a === &#39;!&#39; || $this->a === &#39;&&#39; || $this->a === &#39;|&#39; || $this->a === &#39;?&#39;)) { $this->output .= $this->a . $this->b; for (;;) { $this->a = $this->get(); if ($this->a === &#39;/&#39;) { break; } elseif ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } elseif (ord($this->a) <= self::ORD_LF) { throw new JSMinException(&#39;Unterminated regular expression &#39;. &#39;literal.&#39;); } $this->output .= $this->a; } $this->b = $this->next(); } } } protected function get() { $c = $this->lookAhead; $this->lookAhead = null; if ($c === null) { if ($this->inputIndex <$this->inputLength) { $c = $this->input[$this->inputIndex]; $this->inputIndex += 1; } else { $c = null; } } if ($c === "\r") { return "\n"; } if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { return $c; } return &#39; &#39;; } protected function isAlphaNum($c) { return ord($c) > 126 || $c === &#39;\\&#39; || preg_match(&#39;/^[\w\$]$/&#39;, $c) === 1; } protected function min() { $this->a = "\n"; $this->action(3); while ($this->a !== null) { switch ($this->a) { case &#39; &#39;: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } break; case "\n": switch ($this->b) { case &#39;{&#39;: case &#39;[&#39;: case &#39;(&#39;: case &#39;+&#39;: case &#39;-&#39;: $this->action(1); break; case &#39; &#39;: $this->action(3); break; default: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } } break; default: switch ($this->b) { case &#39; &#39;: if ($this->isAlphaNum($this->a)) { $this->action(1); break; } $this->action(3); break; case "\n": switch ($this->a) { case &#39;}&#39;: case &#39;]&#39;: case &#39;)&#39;: case &#39;+&#39;: case &#39;-&#39;: case &#39;"&#39;: case "&#39;": $this->action(1); break; default: if ($this->isAlphaNum($this->a)) { $this->action(1); } else { $this->action(3); } } break; default: $this->action(1); break; } } } return $this->output; } protected function next() { $c = $this->get(); if ($c === &#39;/&#39;) { switch($this->peek()) { case &#39;/&#39;: for (;;) { $c = $this->get(); if (ord($c) <= self::ORD_LF) { return $c; } } case &#39;*&#39;: $this->get(); for (;;) { switch($this->get()) { case &#39;*&#39;: if ($this->peek() === &#39;/&#39;) { $this->get(); return &#39; &#39;; } break; case null: throw new JSMinException(&#39;Unterminated comment.&#39;); } } default: return $c; } } return $c; } protected function peek() { $this->lookAhead = $this->get(); return $this->lookAhead; } } // -- Exceptions --------------------------------------------------------------- class JSMinException {} //class JSMinException extends Exception {} ?>
* @copyright 2002 Douglas Crockford(jsmin.c) * @copyright 2008 Ryan Grove (PHP port) * @license http://opensource.org/licenses/mit-license.php MIT License * @version 1.1.1 (2008-03-02) * @link http://code.google.com/p/jsmin-php/ */ namespace Common\Extend; class JSMin { const ORD_LF = 10; const ORD_SPACE = 32; protected $a = &#39;&#39;; protected $b = &#39;&#39;; protected $input = &#39;&#39;; protected $inputIndex = 0; protected $inputLength = 0; protected $lookAhead = null; protected $output = &#39;&#39;; // -- Public Static Methods -------------------------------------------------- public static function minify($js) { $jsmin = new JSMin($js); return $jsmin->min(); } // -- Public Instance Methods ------------------------------------------------ public function __construct($input) { $this->input = str_replace("\r\n", "\n", $input); $this->inputLength = strlen($this->input); } // -- Protected Instance Methods --------------------------------------------- protected function action($d) { switch($d) { case 1: $this->output .= $this->a; case 2: $this->a = $this->b; if ($this->a === "&#39;" || $this->a === &#39;"&#39;) { 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(&#39;Unterminated string literal.&#39;); } if ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } } } case 3: $this->b = $this->next(); if ($this->b === &#39;/&#39; && ( $this->a === &#39;(&#39; || $this->a === &#39;,&#39; || $this->a === &#39;=&#39; || $this->a === &#39;:&#39; || $this->a === &#39;[&#39; || $this->a === &#39;!&#39; || $this->a === &#39;&&#39; || $this->a === &#39;|&#39; || $this->a === &#39;?&#39;)) { $this->output .= $this->a . $this->b; for (;;) { $this->a = $this->get(); if ($this->a === &#39;/&#39;) { break; } elseif ($this->a === &#39;\\&#39;) { $this->output .= $this->a; $this->a = $this->get(); } elseif (ord($this->a) <= self::ORD_LF) { throw new JSMinException(&#39;Unterminated regular expression &#39;. &#39;literal.&#39;); } $this->output .= $this->a; } $this->b = $this->next(); } } } protected function get() { $c = $this->lookAhead; $this->lookAhead = null; if ($c === null) { if ($this->inputIndex <$this->inputLength) { $c = $this->input[$this->inputIndex]; $this->inputIndex += 1; } else { $c = null; } } if ($c === "\r") { return "\n"; } if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { return $c; } return &#39; &#39;; } protected function isAlphaNum($c) { return ord($c) > 126 || $c === &#39;\\&#39; || preg_match(&#39;/^[\w\$]$/&#39;, $c) === 1; } protected function min() { $this->a = "\n"; $this->action(3); while ($this->a !== null) { switch ($this->a) { case &#39; &#39;: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } break; case "\n": switch ($this->b) { case &#39;{&#39;: case &#39;[&#39;: case &#39;(&#39;: case &#39;+&#39;: case &#39;-&#39;: $this->action(1); break; case &#39; &#39;: $this->action(3); break; default: if ($this->isAlphaNum($this->b)) { $this->action(1); } else { $this->action(2); } } break; default: switch ($this->b) { case &#39; &#39;: if ($this->isAlphaNum($this->a)) { $this->action(1); break; } $this->action(3); break; case "\n": switch ($this->a) { case &#39;}&#39;: case &#39;]&#39;: case &#39;)&#39;: case &#39;+&#39;: case &#39;-&#39;: case &#39;"&#39;: case "&#39;": $this->action(1); break; default: if ($this->isAlphaNum($this->a)) { $this->action(1); } else { $this->action(3); } } break; default: $this->action(1); break; } } } return $this->output; } protected function next() { $c = $this->get(); if ($c === &#39;/&#39;) { switch($this->peek()) { case &#39;/&#39;: for (;;) { $c = $this->get(); if (ord($c) <= self::ORD_LF) { return $c; } } case &#39;*&#39;: $this->get(); for (;;) { switch($this->get()) { case &#39;*&#39;: if ($this->peek() === &#39;/&#39;) { $this->get(); return &#39; &#39;; } break; case null: throw new JSMinException(&#39;Unterminated comment.&#39;); } } default: return $c; } } return $c; } protected function peek() { $this->lookAhead = $this->get(); return $this->lookAhead; } } // -- Exceptions --------------------------------------------------------------- class JSMinException {} //class JSMinException extends Exception {} ?>