ホームページ > バックエンド開発 > PHPチュートリアル > 複数の CSS および JS ファイルの PHP コードを圧縮する

複数の CSS および JS ファイルの PHP コードを圧縮する

WBOY
リリース: 2016-07-25 09:04:42
オリジナル
1017 人が閲覧しました
  1. header('Content-type: text/css');
  2. function compress($buffer) {
  3. /* コメントを削除 */
  4. $buffer = preg_replace('!/*[^*]**+([^/][^*]**+)*/!', '', $buffer);
  5. /* タブ、スペース、改行などを削除します。 */
  6. $buffer = str_replace(array("rn", "r", "n", "t", ' ', ' ', ' '), '', $buffer);
  7. /* CSS ファイル */
  8. include('galleria.css');
  9. ob_end_flush()
  10. ?>
  11. インスタンス化: テスト.php
test

コード
  1. 2 をコピーします。 jsminクラスの使用 出典: http://code.google.com/p/minify/ 圧縮.php
header('Content-type: text/javascript');
require 'jsmin.php';

echo JSMin::minify(file_get_contents('common.js') . file_get_contents( 'common2.js'));

?>
    コードをコピー
  1. common.js アラート('最初のjs');

    common.js アラート('2番目のjs');

    jsmin.php

    1. /**
    2. * jsmin.php - Douglas Crockford の JSMin の拡張 PHP 実装。
    3. *
    4. * <コード>
    5. * $minifiedJs = JSMin::minify($js);
    6. *
    7. *
    8. * これは jsmin.c を PHP に直接移植したもので、いくつかの PHP パフォーマンスの調整と
    9. * のコメントを保持するための変更が加えられています (以下を参照)。また、
    10. * stdin/stdout を使用するのではなく、JSMin::minify() は文字列を入力として受け入れ、別の
    11. * 文字列を出力として返します。
    12. *
    13. * IE 条件付きコンパイルを含むコメントは、複数行と同様に保持されます
    14. * "/*!" で始まるコメント(文書化目的)。後者の場合
    15. * 読みやすくするためにコメントの前後に改行が挿入されます。
    16. *
    17. * PHP 5 以上が必要です。
    18. *
    19. * 以下のライセンスを持つ
    20. * jsmin.c と同じ条件に基づいて、このバージョンのライブラリを使用する許可がここに与えられます:
    21. *
    22. * --
    23. * Copyright (c) 2002 Douglas Crockford (www. crockford.com)
    24. *
    25. * このソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手する人には、
    26. * 以下を含む制限なくソフトウェアを取り扱う許可が、無償で付与されます
    27. *制限なく、本ソフトウェアのコピーを
    28. * 使用、コピー、変更、マージ、公開、配布、サブライセンス、および/または販売する権利
    29. *、およびソフトウェアが提供される人物に以下の行為を許可する権利
    30. * したがって、以下の条件:
    31. *
    32. * 上記の著作権表示およびこの許可通知は、
    33. * ソフトウェアのすべてのコピーまたは実質的な部分に含まれるものとします。
    34. *
    35. * ソフトウェアは悪ではなく善のために使用されるものとします。
    36. *
    37. * ソフトウェアは、明示または黙示を問わず、いかなる種類の保証もなく、「現状のまま」で提供されます。
    38. * 商品性、
    39. * 特定目的への適合性および非侵害の保証を含みますがこれらに限定されません。いかなる場合においても、
    40. * 作者または著作権所有者は、契約行為、不法行為またはその他の行為であるかどうかにかかわらず、
    41. * ソフトウェアまたはソフトウェアに関連して、またはそれに関連して生じる、あらゆる請求、損害、またはその他の責任について責任を負わないものとします。
    42. * ソフトウェアの使用またはその他の取引。
    43. * --
    44. *
    45. * @package JSMin
    46. * @author Ryan Grove (PHP ポート)
    47. * @author Steve Clay (修正 + クリーンアップ)
    48. * @author Andrea Giammarchi (spaceBeforeRegExp)
    49. * @copyright 2002 Douglas Crockford (jsmin.c)
    50. * @copyright 2008 Ryan Grove (PHP ポート)
    51. * @license http://opensource.org/licenses/mit-license.php MIT ライセンス
    52. * @link http://code.google.com/p/jsmin-php/
    53. */
    54. class JSMin {
    55. const ORD_LF = 10;
    56. const ORD_SPACE = 32;
    57. const ACTION_KEEP_A = 1;
    58. const ACTION_DELETE_A = 2;
    59. const ACTION_DELETE_A_B = 3;
    60. protected $a = "n";
    61. 保護された $b = '';
    62. protected $input = '';
    63. 保護された $inputIndex = 0;
    64. protected $inputLength = 0;
    65. protected $lookAhead = null;
    66. protected $output = '';
    67. /**
    68. * JavaScript を縮小します
    69. *
    70. * @param string $js 縮小する Javascript
    71. * @return string
    72. */
    73. public static function minify($js)
    74. {
    75. // "++ +" や "- ++" のような構文に注意してください
    76. $p = '\+';
    77. $m = '\-';
    78. if (preg_match("/([$p$m])(?:\1 [$p$m]| (?:$p$p|$m$m))/", $js)) {
    79. // 事前に縮小化されている可能性が高く、JSMin によって壊れる可能性があります
    80. return $js;
    81. }
    82. $jsmin = 新しい JSMin($js);
    83. return $jsmin->min();
    84. }
    85. /*
    86. * JSMin インスタンスを作成せず、代わりに静的関数 minify を使用します
    87. * mb_string 関数のオーバーロードをチェックしてエラーを回避します
    88. * Closure Compiler の出力を再縮小しようとします
    89. *
    90. * @private
    91. */
    92. public function __construct($input)
    93. {
    94. $this->input = $input;
    95. }
    96. /**
    97. * 縮小を実行し、結果を返します
    98. */
    99. public function min()
    100. {
    101. if ($this->output !== '') { // min はすでに実行されています
    102. return $this->output; $mbIntEnc = null;
    103. if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
    104. $mbIntEnc = mb_internal_encoding();
    105. mb_internal_encoding('8bit');
    106. }
    107. $this->input = str_replace("rn", "n", $this->input);
    108. $this->inputLength = strlen($this->input);
    109. $this->action(self::ACTION_DELETE_A_B);
    110. while ($this->a !== null) {
    111. // 次のコマンドを決定
    112. $command = self::ACTION_KEEP_A; // デフォルト
    113. if ($this->a === ' ') {
    114. if (! $this->isAlphaNum($this->b)) {
    115. $command = self::ACTION_DELETE_A;
    116. }
    117. } elseif ($this->a === "n") {
    118. if ($this->b === ' ') {
    119. $command = self::ACTION_DELETE_A_B;
    120. // mbstring.func_overload & 2 の場合、null b をチェックする必要があります。
    121. // それ以外の場合、mb_strpos は警告を出します
    122. } elseif ($this->b === null
    123. || (false === strpos( '{[(+-', $this->b)
    124. && ! $this->isAlphaNum($this->b))) {
    125. $command = self::ACTION_DELETE_A
    126. }
    127. } elseif ( ! $this->isAlphaNum($this->a)) {
    128. if ($this->b === ' '
    129. || ($this->b === "n"
    130. && ( false === strpos('}])+-"'', $this->a)))) {
    131. $command = self::ACTION_DELETE_A_B;
    132. }
    133. }
    134. $this->action($command );
    135. }
    136. $this->output = トリム($this->output);
    137. if ($mbIntEnc !== null) {
    138. mb_internal_encoding($mbIntEnc);
    139. }
    140. $this->output; を返す
    141. }
    142. /**
    143. * ACTION_KEEP_A = A を出力します。B を A にコピーします。次の B を取得します。
    144. * ACTION_DELETE_A = B を A にコピーします。次の B を取得します。
    145. * ACTION_DELETE_A_B = 次の B を取得します。
    146. */
    147. 保護された関数 action($command)
    148. {
    149. switch ($command) {
    150. case self::ACTION_KEEP_A:
    151. $this->output .= $this-> a;
    152. // フォールスルー
    153. ケース self::ACTION_DELETE_A:
    154. $this->a = $this->b;
    155. if ($this->a === "'" || $this->a === '"') { // 文字列リテラル
    156. $str = $this->a; // ケースの場合例外に必要です
    157. while (true) {
    158. $this->output .= $this->a;
    159. $this->a = $this->get(); a === $this->b) { // 引用符の終了
    160. Break; }
    161. if (ord($this->a) <= self::ORD_LF) {
    162. throw new JSMin_UnterminatedStringException(
    163. "JSMin : バイト "
    164. . $this->inputIndex . ": {$str}"); の終端されていない文字列
    165. }
    166. $str .= $this->a;
    167. if ($this->a === '\') {
    168. $this->output .= $this->a;
    169. $this->a = $this->get();
    170. $str .= $this->a;
    171. }
    172. }
    173. }
    174. // フォールスルー
    175. ケース self::ACTION_DELETE_A_B:
    176. $this->b = $this->next();
    177. if ($this->b === '/' && $this->isRegexpLiteral()) { // RegExp リテラル
    178. $this->output .= $this->a . $this->b;
    179. $パターン = '/'; // 例外で必要な場合
    180. while (true) {
    181. $this->a = $this->get();
    182. $pattern .= $this->a;
    183. if ($this->a === '/') { // パターン終了
    184. Break; // while (true)
    185. } elseif ($this->a === '\') {
    186. $this->output .= $this->a;
    187. $this->a = $this->get();
    188. $pattern .= $this->a;
    189. } elseif (ord($this->a) <= self::ORD_LF) {
    190. throw new JSMin_UnterminatedRegExpException(
    191. "JSMin: バイト "
    192. . $this->inputIndex .": {$pattern }");
    193. }
    194. $this->output .= $this->a;
    195. }
    196. $this->b = $this->next();
    197. }
    198. // ACTION_DELETE_A_B の終了
    199. }
    200. }
    201. protected function isRegexpLiteral()
    202. {
    203. if (false !== strpos("n{;(,=:[!&|?", $this-> a)) { // 分割はしません
    204. return true; }
    205. if (' ' === $this->a) {
    206. $length = strlen($this->output); $length < 2) { // 奇妙なエッジケース
    207. return true }
    208. // キーワードを分割することはできません
    209. if (preg_match('/(?:case|else|in|return|typeof); ', $this->output, $m)) {
    210. if ($this->output === $m[0]) { // 奇妙なことですが、起こる可能性があります
    211. return true
    212. }
    213. // 確認してください。これはキーワードであり、識別子の終わりではありません
    214. $charBeforeKeyword = substr($this->output, $length - strlen($m[0]) - 1, 1);
    215. if (! $this->isAlphaNum($charBeforeKeyword)) {
    216. true を返します。
    217. }
    218. }
    219. }
    220. false を返します。
    221. }
    222. /**
    223. * 次の文字を取得します。 Ctrl 文字をスペースに変換します。
    224. */
    225. 保護された関数 get()
    226. {
    227. $c = $this->lookAhead;
    228. $this->lookAhead = null;
    229. if ($c === null) {
    230. if ($this->inputIndex < $this->inputLength) {
    231. $c = $this->input[$this->inputIndex];
    232. $this->inputIndex += 1;
    233. } else {
    234. null を返します。
    235. }
    236. }
    237. if ($c === "r" || $c === "n") {
    238. return "n";
    239. }
    240. if (ord($c) < self::ORD_SPACE) { // 制御文字
    241. return ' ';
    242. }
    243. $c を返します。
    244. }
    245. /**
    246. * 次の文字を取得します。 Ctrl 文字の場合は、スペースまたは改行に変換されます。
    247. */
    248. 保護された関数 Peak()
    249. {
    250. $this->lookAhead = $this->get();
    251. $this->lookAhead; を返す
    252. }
    253. /**
    254. * $c は文字、数字、アンダースコア、ドル記号、エスケープ、または非 ASCII ですか?
    255. */
    256. 保護された関数 isAlphaNum($c)
    257. {
    258. return (preg_match('/^[0-9a-zA-Z_\$\\]$/', $c) || ord($c) > 126);
    259. }
    260. 保護関数singleLineComment()
    261. {
    262. $comment = '';
    263. while (true) {
    264. $get = $this->get();
    265. $comment .= $get;
    266. if (ord($get) <= self::ORD_LF) { // EOL に達しました
    267. // IE の条件付きコメント
    268. if (preg_match('/^\/@(?:cc_on|if|elif|else| end)\b/', $comment)) {
    269. return "/{$comment}";
    270. }
    271. return $get;
    272. }
    273. }
    274. }
    275. protected function multipleLineComment()
    276. {
    277. $this->get();
    278. $comment = '';
    279. while (true) {
    280. $get = $this->get();
    281. if ($get === '*') {
    282. if ($this->peek() === '/') { // コメントの終わりに達しました
    283. $ this->get();
    284. // YUI Compressor によってコメントが保存されている場合
    285. if (0 === strpos($comment, '!')) {
    286. return "n/*" . . "*/n";
    287. }
    288. // IE の条件付きコメント
    289. if (preg_match('/^@(?:cc_on|if|elif|else|end)\b/', $comment)) {
    290. return "/*{$comment}*/";
    291. }
    292. return ' ';
    293. }
    294. } elseif ($get === null) {
    295. throw new JSMin_UnterminatedCommentException(
    296. "JSMin: バイト "
    297. . $this->inputIndex 。 ": /*{$コメント}");
    298. }
    299. $comment .= $get;
    300. }
    301. }
    302. /**
    303. * コメントをスキップして次の文字を取得します。
    304. ※一部のコメントは保存される場合がございます。
    305. */
    306. 保護関数 next()
    307. {
    308. $get = $this->get();
    309. if ($get !== '/') {
    310. return $get;
    311. }
    312. switch ($this->peek()) {
    313. case '/': return $this->singleLineComment();
    314. case '*': return $this->multipleLineComment();
    315. デフォルト: $get を返します。
    316. }
    317. }
    318. }
    319. class JSMin_UnterminatedStringException extends Exception {}
    320. class JSMin_UnterminatedCommentException extends Exception {}
    321. class JSMin_UnterminatedRegExpException extends Exception {}
    322. ?>
    复制代码

    调の用例:

    复制代


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート