複数の CSS および JS ファイルを圧縮するための
php メソッド、
この記事の例では、PHP で複数の CSS ファイルと JS ファイルを圧縮する方法を説明します。参考のためにみんなで共有してください。具体的な実装方法は以下の通りです
1. CSSを圧縮します
コードをコピーします コードは次のとおりです:
header('コンテンツタイプ: text/css');
ob_start("圧縮");
関数圧縮($buffer) {
/* コメントを削除 */
$buffer = preg_replace('!/*[^*]**+([^/][^*]**+)*/!', '', $buffer);
/* タブ、スペース、改行などを削除します。 */
$buffer = str_replace(array("rn", "r", "n", "t", ' ', ' ', ' '), '', $buffer);
$buffer を返します
}
/* CSS ファイル */
include('galleria.css')
include('articles.css')
ob_end_flush();
使用方法:
コードをコピーします
コードは次のとおりです:
2. jsを圧縮し、jsminクラスを使用します:
この例は http://code.google.com/p/minify/ から引用しています。
コードをコピーします
コードは次のとおりです: header('Content-type: text/javascript');
'jsmin.php' が必要です。
echo JSMin::minify(file_get_contents('common.js') . file_get_contents('common2.js'));
jsmin.php ファイルは次のとおりです:
コードをコピーします
コードは次のとおりです:
/**
* jsmin.php - Douglas Crockford の JSMin.
の PHP 実装
*
* これは、jsmin.c をほんの少しだけ PHP に直接移植したものです
* PHP 固有のパフォーマンスの調整。また、jsmin.c は stdin から読み取りますが、
* stdout に出力します。このライブラリは文字列を入力として受け入れ、別の文字列を返します
* 出力としての文字列
*
※PHP5以上が必要です
*
* このバージョンのライブラリを使用する許可は、
に基づいて付与されます。
* 次のライセンスを持つ jsmin.c と同じ条件:
*
* --
* 著作権 (c) 2002 Douglas Crockford (www.crockford.com)
*
*
のコピーを入手する人には、無償で許可が与えられます。
* このソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) を取り扱う
* 制限のないソフトウェア (以下の権利を含む)
* コピーの使用、コピー、変更、マージ、公開、配布、サブライセンス、および/または販売
* ソフトウェアの提供、およびソフトウェアが提供された人に以下の行為を許可すること
* したがって、次の条件が適用されます:
*
※上記著作権表示と本許諾表示は全て含まれるものとします
* ソフトウェアのコピーまたは実質的な部分。
*
* ソフトウェアは悪ではなく善のために使用されるものとします。
*
* ソフトウェアは「現状のまま」提供され、明示または
を問わずいかなる種類の保証もありません。
* 商品性の保証を含みますがこれに限定されない、黙示的です
* 特定の目的への適合性および非侵害。いかなる場合も
* 著者または著作権所有者は、あらゆる請求、損害、その他について責任を負います
* 契約行為、不法行為、その他に関わらず、
から生じる責任
* ソフトウェア、または
での使用やその他の取引に関連して、またはそれに関連して
* ソフトウェア
* --
*
* @package JSMin
* @著者ライアン グローブ
* @copyright 2002 Douglas Crockford (jsmin.c)
* @copyright 2008 Ryan Grove (PHP ポート)
* @copyright 2012 Adam Goforth (更新)
* @license http://opensource.org/licenses/mit-license.php MIT ライセンス
* @バージョン 1.1.2 (2012-05-01)
* @link https://github.com/rgrove/jsmin-php
*/
クラス 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;
保護された $a = '';
保護された $b = '';
protected $input = '';
protected $inputIndex = 0;
protected $inputLength = 0;
protected $lookAhead = null;
protected $output = '';
// -- パブリック静的メソッド -------------------------------------- -----
/**
* Javascript を縮小
*
* @__construct() を使用します
* @はmin()を使用します
* @param string $js 縮小されるJavaScript
* @戻り文字列
*/
パブリック静的関数 minify($js) {
$jsmin = 新しい JSMin($js);
return $jsmin->min();
}
// -- パブリック インスタンス メソッド -------------------------------------- -----
/**
* コンストラクター
*
* @param string $input 縮小されるJavaScript
*/
パブリック関数 __construct($input) {
$this->input = str_replace("rn", "n", $input);
$this->inputLength = strlen($this->input);
}
// -- 保護されたインスタンス メソッド -------------------------------------- --
/**
* アクション -- 何かをしてください!何をするかは $command 引数によって決まります。
*
* アクションは文字列を単一の文字として扱います。うわー!
* アクションの前に ( 、 、 または = が付いている場合) は正規表現を認識します
*
* @はnext()を使用します
* @get()を使用します
* @throws JSMinException パーサーエラーが見つかった場合:
* - 終了していない文字列リテラル
* - 正規表現リテラルに設定された終端のない正規表現
* - 終了していない正規表現リテラル
* @param int $command クラス定数の 1 つ:
* ACTION_KEEP_A A を出力します。B を A にコピーします。次の B を取得します。
* ACTION_DELETE_A B を A にコピーします。次の B を取得します。(A を削除)。
* ACTION_DELETE_A_B 次の B を取得します (B を削除します)。
*/
保護された関数アクション($command) {
スイッチ($コマンド) {
ケース self::ACTION_KEEP_A:
$this->output .= $this->a;
ケース self::ACTION_DELETE_A:
$this->a = $this->b;
if ($this->a === "'" || $this->a === '"') {
(;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === $this->b) {
休憩;
}
if (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('終了していない文字列リテラル。');
}
if ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
}
}
}
ケース 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;
(;;) {
$this->a = $this->get();
if ($this->a === '[') {
/*
正規表現 [...] セット内には、「/」自体を含めることができます。例: mootools Form.Validator 行 460 付近:
|| 戻り値 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'));
*/
(;;) {
$this->output .= $this->a;
$this->a = $this->get();
if ($this->a === ']') {
休憩;
elseif ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('正規表現リテラルに終了していない正規表現が設定されています。');
}
}
elseif ($this->a === '/') {
休憩;
elseif ($this->a === '\') {
$this->output .= $this->a;
$this->a = $this->get();
elseif (ord($this->a) <= self::ORD_LF) {
throw new JSMinException('終了していない正規表現リテラル。');
}
$this->output .= $this->a;
}
$this->b = $this->next();
}
}
}
/**
* 次の文字を取得します。 Ctrl 文字をスペースに変換します。
*
* @return string|null
*/
保護された関数 get() {
$c = $this->先読み;
$this->lookAhead = null;
if ($c === null) {
if ($this->inputIndex < $this->inputLength) {
$c = substr($this->input, $this->inputIndex, 1);
$this->inputIndex += 1;
} その他 {
$c = null;
}
}
if ($c === "r") {
「n」を返します;
}
if ($c === null || $c === "n" || ord($c) >= self::ORD_SPACE) {
$c を返します;
}
' ' を返します;
}
/**
* $c は文字、数字、アンダースコア、ドル記号、または非 ASCII 文字ですか。
*
* @return bool
*/
保護された関数 isAlphaNum($c) {
ord($c) を返す > 126 || $c === '\' || preg_match('/^[w$]$/', $c) === 1;
}
/**
* 縮小を実行し、結果を返します
*
* @アクション()を使用します
* @isAlphaNum() を使用します
* @get()を使用します
* @はpeek()を使用します
* @戻り文字列
*/
保護された関数 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) {
スイッチ ($this->a) {
ケース「 」:
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
} その他 {
$this->action(self::ACTION_DELETE_A);
}
休憩;
ケース「n」:
スイッチ ($this->b) {
ケース '{':
ケース '[':
場合 '(':
ケース「+」:
ケース「-」:
ケース「!」:
ケース「~」:
$this->action(self::ACTION_KEEP_A);
休憩;
ケース「 」:
$this->action(self::ACTION_DELETE_A_B);
休憩;
デフォルト:
if ($this->isAlphaNum($this->b)) {
$this->action(self::ACTION_KEEP_A);
}
他に{
$this->action(self::ACTION_DELETE_A);
}
}
休憩;
デフォルト:
スイッチ ($this->b) {
ケース「 」:
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
休憩;
}
$this->action(self::ACTION_DELETE_A_B);
休憩;
ケース「n」:
スイッチ ($this->a) {
ケース '}':
ケース ']':
ケース ')':
ケース「+」:
ケース「-」:
ケース「」」:
ケース「'」:
$this->action(self::ACTION_KEEP_A);
休憩;
デフォルト:
if ($this->isAlphaNum($this->a)) {
$this->action(self::ACTION_KEEP_A);
}
他に{
$this->action(self::ACTION_DELETE_A_B);
}
}
休憩;
デフォルト:
$this->action(self::ACTION_KEEP_A);
休憩;
}
}
}
$this->出力を返す;
}
/**
* コメントをスキップして次の文字を取得します。 Peak() は見るために使用されます
* 「/」の後に「/」または「*」が続く場合。
*
* @get()を使用します
* @はpeek()を使用します
* @throws JSMinException 終了していないコメントの場合。
* @戻り文字列
*/
保護された関数 next() {
$c = $this->get();
if ($c === '/') {
switch($this->peek()) {
ケース '/':
(;;) {
$c = $this->get();
if (ord($c)
$c を返します;
}
}
ケース '*':
$this->get();
(;;) {
switch($this->get()) {
ケース '*':
if ($this->peek() === '/') {
$this->get();
' ' を返します;
}
休憩;
null の場合:
throw new JSMinException('終了していないコメント。');
}
}
デフォルト:
$c を返す;
}
}
$c を返します;
}
/**
* 次の文字を取得します。 Ctrl 文字の場合は、スペースまたは改行に変換します。
*
* @get()を使用します
* @return string|null
*/
保護された関数 Peak() {
$this->lookAhead = $this->get();
$this->lookAhead;を返す
}
}
// --例外 -------------------------------------------------- --- ------------------
クラス JSMinException は例外 {}
を拡張します
?>
この記事で説明した内容が皆様の PHP プログラミング設計に役立つことを願っています。
http://www.bkjia.com/PHPjc/909338.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/909338.html技術記事 PHP で複数の CSS および JS ファイルを圧縮する方法を実装します。 この記事では、PHP で複数の CSS および JS ファイルを圧縮する方法について説明します。参考のためにみんなで共有してください。具体的な実装方法は以下の通りです。 1....
を押します。