> 백엔드 개발 > PHP 튜토리얼 > 여러 CSS 및 JS 파일의 PHP 코드 압축

여러 CSS 및 JS 파일의 PHP 코드 압축

WBOY
풀어 주다: 2016-07-25 09:04:42
원래의
1050명이 탐색했습니다.
  1. header('Content-type: text/css')
  2. ob_start("compress")
  3. 함수 압축 ($buffer) {
  4. /* 주석 제거 */
  5. $buffer = preg_replace('!/*[^*]** ([^/][^*]** )*/!', ' ', $buffer);
  6. /* 탭, 공백, 줄 바꿈 등을 제거합니다. */
  7. $buffer = str_replace(array("rn", "r", "n", "t", ' ' , ' ', ' '), '', $buffer);
  8. return $buffer
  9. }
  10. /* CSS 파일 */
  11. include('galleria.css') ;
  12. include('articles.css');
  13. ob_end_flush()
  14. ?>
코드 복사

변화: 테스트.php

  1. test
코드 복사

2. jsmin 클래스 사용 출처: http://code.google.com/p/minify/ 압축.php

  1. header('콘텐츠 유형: text/javascript')
  2. require 'jsmin.php'; >echo JSMin::minify(file_get_contents('common.js') .file_get_contents('common2.js'))
  3. ?>
코드 복사

common.js 경고('첫번째 js');

common.js 경보('두 번째 js');

jsmin.php

  1. /**
  2. * jsmin.php - Douglas Crockford의 JSMin의 확장된 PHP 구현입니다.
  3. *
  4. * <코드>
  5. * $minifiedJs = JSMin::minify($js);
  6. *
  7. *
  8. * 이것은 몇 가지 PHP 성능 조정과
  9. * 일부 주석을 보존하기 위한 수정을 통해 jsmin.c를 PHP로 직접 포팅한 것입니다(아래 참조). 또한
  10. * stdin/stdout을 사용하는 대신 JSMin::minify()는 문자열을 입력으로 받아들이고 다른
  11. * 문자열을 출력으로 반환합니다.
  12. *
  13. * IE 조건부 컴파일이 포함된 주석은 여러 줄
  14. * "/*!"로 시작하는 주석과 마찬가지로 유지됩니다. (문서화 목적으로). 후자의 경우
  15. * 가독성을 높이기 위해 주석 주위에 줄바꿈을 삽입합니다.
  16. *
  17. * PHP 5 이상이 필요합니다.
  18. *
  19. * 다음 라이센스가 있는 jsmin.c와
  20. * 동일한 조건에 따라 이 버전의 라이브러리를 사용할 수 있는 권한이 부여됩니다.
  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. *
  46. * @package JSMin
  47. * @author Ryan Grove (PHP 포트)
  48. * @author Steve Clay (수정 사항 정리)
  49. * @author Andrea Giammarchi (spaceBeforeRegExp)
  50. * @copyright 2002 Douglas Crockford (jsmin.c)
  51. * @copyright 2008 Ryan Grove (PHP 포트)
  52. * @license http://opensource.org/licenses/mit-license.php MIT 라이센스
  53. * @link http://code.google.com/p/jsmin-php/
  54. */
  55. class JSMin {
  56. const ORD_LF = 10;
  57. const ORD_SPACE = 32;
  58. const ACTION_KEEP_A = 1;
  59. const ACTION_DELETE_A = 2;
  60. const ACTION_DELETE_A_B = 3;
  61. protected $a = "n";
  62. 보호된 $b = '';
  63. 보호된 $input = '';
  64. 보호된 $inputIndex = 0;
  65. 보호된 $inputLength = 0;
  66. 보호된 $lookAhead = null;
  67. 보호된 $output = '';
  68. /**
  69. * Javascript 축소
  70. *
  71. * @param string $js 축소할 Javascript
  72. * @return string
  73. */
  74. public static function minify($js)
  75. {
  76. // " " 및 "- "와 같은 구문을 찾습니다.
  77. $p = '\';
  78. $m = '\-';
  79. if (preg_match("/([$p$m])(?:\1 [$p$m]| (?:$p$p|$m$m))/", $js)) {
  80. // 미리 축소되어 JSMin에 의해 깨질 가능성이 높습니다.
  81. return $js;
  82. }
  83. $jsmin = 새로운 JSMin($js);
  84. return $jsmin->min();
  85. }
  86. /*
  87. * JSMin 인스턴스를 생성하지 말고 대신 정적 함수 minify를 사용하세요.
  88. * mb_string 함수 오버로드를 확인하고 오류를 방지하는
  89. * 시도 중 Closure Compiler의 출력을 다시 축소합니다
  90. *
  91. * @private
  92. */
  93. public function __construct($input)
  94. {
  95. $this->input = $input;
  96. }
  97. /**
  98. * 축소 수행, 결과 반환
  99. */
  100. public function min()
  101. {
  102. if ($this->output !== '') { // min은 이미 실행되었습니다
  103. return $this->output;
  104. }
  105. $mbIntEnc = null;
  106. if (function_exists('mb_strlen') && ((int)ini_get('mbstring.func_overload') & 2)) {
  107. $mbIntEnc = mb_internal_encoding();
  108. mb_internal_encoding('8bit');
  109. }
  110. $this->input = str_replace("rn", "n", $this->input);
  111. $this->inputLength = strlen($this->input);
  112. $this->action(self::ACTION_DELETE_A_B);
  113. while ($this->a !== null) {
  114. // 다음 명령 결정
  115. $command = self::ACTION_KEEP_A; // 기본값
  116. if ($this->a === ' ') {
  117. if (! $this->isAlphaNum($this->b)) {
  118. $command = self ::ACTION_DELETE_A;
  119. }
  120. } elseif ($this->a === "n") {
  121. if ($this->b === ' ') {
  122. $command = self: :ACTION_DELETE_A_B;
  123. // mbstring.func_overload & 2의 경우 null b를 확인해야 합니다.
  124. // 그렇지 않으면 mb_strpos가 경고를 표시합니다
  125. } elseif ($this->b === null
  126. | | (false === strpos('{[( -', $this->b)
  127. && ! $this->isAlphaNum($this->b))) {
  128. $command = self::ACTION_DELETE_A
  129. }
  130. } elseif (! $this->isAlphaNum($this->a)) {
  131. if ($this->b === ' '
  132. || ($this->b === "n"
  133. && (false === strpos('}]) -"'', $this->a)))) {
  134. $command = self::ACTION_DELETE_A_B;
  135. }
  136. }
  137. $this->action($command)
  138. }
  139. $this->output = Trim($this-> ;출력);
  140. if ($mbIntEnc !== null) {
  141. mb_internal_encoding($mbIntEnc);
  142. }
  143. return $this->output;
  144. }
  145. /**
  146. * ACTION_KEEP_A = 출력 A. B를 A에 복사합니다. 다음 B를 가져옵니다.
  147. * ACTION_DELETE_A = B를 A에 복사합니다. 다음 B를 가져옵니다.
  148. * ACTION_DELETE_A_B = 다음 B를 가져옵니다.
  149. */
  150. 보호 함수 동작($command)
  151. {
  152. 스위치($command) {
  153. case self::ACTION_KEEP_A:
  154. $this->output .= $this->a;
  155. // 대체
  156. case self::ACTION_DELETE_A:
  157. $this->a = $this->b;
  158. if ($this->a === "'" || $this->a === '"') { // 문자열 리터럴
  159. $str = $this->a; // 예외가 필요한 경우
  160. while (true) {
  161. $this->output .= $this->a
  162. $this->a = $this->get( );
  163. if ($this->a === $this->b) { // 인용 끝
  164. break
  165. }
  166. if (ord($this->a) ) <= self::ORD_LF) {
  167. throw new JSMin_UnterminatingStringException(
  168. "JSMin: 바이트에서 종료되지 않은 문자열 "
  169. . $this->inputIndex . ": {$str}"); > }
  170. $str .= $this->a;
  171. if ($this->a === '\') {
  172. $this->output .= $this-> ;에이;
  173. $this->a = $this->get();
  174. $str .= $this->a;
  175. }
  176. }
  177. }
  178. // 대체
  179. case self::ACTION_DELETE_A_B:
  180. $this->b = $this->next();
  181. if ($this->b === '/' && $this->isRegexpLiteral()) { // RegExp 리터럴
  182. $this->output .= $this->a . $this->b;
  183. $패턴 = '/'; // 예외가 필요한 경우
  184. while (true) {
  185. $this->a = $this->get();
  186. $pattern .= $this->a;
  187. if ($this->a === '/') { // 패턴 종료
  188. break; // while (true)
  189. } elseif ($this->a === '\') {
  190. $this->output .= $this->a;
  191. $this->a = $this->get();
  192. $pattern .= $this->a;
  193. } elseif (ord($this->a) <= self::ORD_LF) {
  194. throw new JSMin_UnterminatingRegExpException(
  195. "JSMin: 바이트에서 종료되지 않은 RegExp "
  196. . $this-> ;inputIndex .": {$패턴}");
  197. }
  198. $this->output .= $this->a;
  199. }
  200. $this->b = $this->next();
  201. }
  202. // 케이스 종료 ACTION_DELETE_A_B
  203. }
  204. }
  205. 보호 함수 isRegexpLiteral()
  206. {
  207. if (false !== strpos("n{; (,=:[!&|?", $this->a)) { // 나누지 않습니다
  208. return true;
  209. }
  210. if (' ' === $this- >a) {
  211. $length = strlen($this->output);
  212. if ($length < 2) { // 이상한 경우
  213. return true; > // 키워드는 나눌 수 없습니다
  214. if (preg_match('/(?:case|else|in|return|typeof)$/', $this->output, $m)) {
  215. if ($this->output === $m[0]) { // 이상하지만 일어날 수 있습니다
  216. return true
  217. }
  218. // 키워드인지 확인하고 끝이 아닌지 확인하세요. 식별자
  219. $charBeforeKeyword = substr($this->output, $length - strlen($m[0]) - 1, 1);
  220. if (! $this->isAlphaNum($charBeforeKeyword)) {
  221. return true;
  222. }
  223. }
  224. }
  225. false를 반환합니다.
  226. }
  227. /**
  228. * 다음 문자를 가져옵니다. Ctrl 문자를 공백으로 변환합니다.
  229. */
  230. 보호 함수 get()
  231. {
  232. $c = $this->lookAhead;
  233. $this->lookAhead = null;
  234. if ($c === null) {
  235. if ($this->inputIndex < $this->inputLength) {
  236. $c = $this->input[$this- >입력인덱스];
  237. $this->inputIndex = 1;
  238. } else {
  239. null을 반환합니다.
  240. }
  241. }
  242. if ($c === "r" || $c === "n") {
  243. return "n";
  244. }
  245. if (ord($c) < self::ORD_SPACE) { // 제어 문자
  246. return ' ';
  247. }
  248. $c를 반환합니다.
  249. }
  250. /**
  251. * 다음 문자를 가져옵니다. Ctrl 문자인 경우 공백이나 개행 문자로 변환합니다.
  252. */
  253. 보호 함수 peek()
  254. {
  255. $this->lookAhead = $this->get();
  256. return $this->lookAhead;
  257. }
  258. /**
  259. * $c는 문자, 숫자, 밑줄, 달러 기호, 이스케이프 또는 비ASCII입니까?
  260. */
  261. 보호 함수 isAlphaNum($c)
  262. {
  263. return (preg_match('/^[0-9a-zA-Z_ \$\\]$/', $c) || ​​ord($c) >
  264. }
  265. 보호 함수 SingleLineComment()
  266. {
  267. $comment = '';
  268. while (true) {
  269. $get = $this->get();
  270. $comment .= $get;
  271. if (ord($get) <= self::ORD_LF) { // EOL 도달
  272. // IE 조건부 주석
  273. if (preg_match('/^\/@(?:cc_on| if|elif|else|end)\b/', $comment)) {
  274. return "/{$comment}";
  275. }
  276. return $get;
  277. }
  278. }
  279. }
  280. 보호 함수 multipleLineComment()
  281. {
  282. $this->get( );
  283. $comment = '';
  284. while (true) {
  285. $get = $this->get()
  286. if ($get === '*') 🎜> if ($this->peek() === '/') { // 주석 끝에 도달했습니다
  287. $this->get()
  288. // YUI Compressor에 의해 주석이 보존된 경우
  289. if (0 === strpos($comment, '!')) {
  290. return "n/*" . substr($comment, 1)
  291. }
  292. // IE 조건부 주석
  293. if (preg_match('/^@(?:cc_on|if|elif|else|end)\b/', $comment)) {
  294. return "/*{$comment }*/";
  295. }
  296. ' ' 반환;
  297. }
  298. } elseif ($get === null) {
  299. throw new JSMin_UnterminatingCommentException(
  300. "JSMin: 바이트에서 종료되지 않은 주석 "
  301. . $this->inputIndex . ": / *{$설명}");
  302. }
  303. $comment .= $get;
  304. }
  305. }
  306. /**
  307. * 댓글을 건너뛰고 다음 문자를 가져옵니다.
  308. * 일부 댓글은 보존될 수 있습니다.
  309. */
  310. 보호 함수 next()
  311. {
  312. $get = $this->get();
  313. if ($get !== '/') {
  314. return $get;
  315. }
  316. 스위치 ($this->peek()) {
  317. 케이스 '/': return $this->singleLineComment();
  318. 케이스 '*': return $this->multipleLineComment();
  319. 기본값: $get을 반환합니다.
  320. }
  321. }
  322. }
  323. 클래스 JSMin_UnterminatingStringException은 예외를 확장합니다. >
  324. 复主代码
调用示例:

    제제대码
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿