-
-
/* 2008 年 4 月 9 日。版本1.1
- *
- * 這是Dean Edwards JavaScript Packer 的php 版本,
- * 基於:
- *
- * ParseMaster,版本1.0.2 (2005-08-19) 版權所有2005Master,版本1.0.2 (2005-08-19) 版權所有2005Master,版本 1.0.2 (2005-08-19) 版權所有2005Master ,Dean Edwards
- * 多模式解析器。
- * 已知錯誤:使用escapeChar 替換時會出現錯誤
- * 值是一個函數
- *
- * packer,版本2.0.2 (2005-08-19) 版權所有2004-2005 , Dean Edwards
- *
- * 授權:http://creativecommons.org/licenses/LGPL/2.1/
- *
- * 由Nicolas Martin 移植到PHP。
- *
- * ------------------------------------------ ----------------------------
- * 變更日誌:
- * 1.1 : 修正一個錯誤,然後打包'/0 '解壓後變成“/”。
- * ---------------------------------------------- ------------ ------------------------
- *
- * 使用範例:
- * $myPacker = new JavaScriptPacker($script, 62 ,真,假);
- * $packed = $myPacker->pack();
- *
- * 或
- *
- * $ myPacker = new JavaScriptPacker($script, 'Normal', true, false);
- * $packed = $myPacker->pack();
- *
- * 或(預設值)
- *
- * $myPacker = new JavaScriptPacker($script);
- * $packed = $myPacker->pack();
- *
- *
- * 建構子的參數:
- * $ $ script:要打包的JavaScript,字串。
- * $encoding:編碼級別,整數或字串:
- * 0,10,62,95 或 'None', 'Numeric', 'Normal', 'High ASCII'。
- * 預設值:62。
- * $fastDecode:在打包結果中包含快速解碼器,布林值。
- * 預設值:true。
- * $specialChars:如果您在腳本中標記了私有和局部變數
- *,布林值。
- * 預設值: false。
- *
- * pack() 方法以字串形式傳回壓縮的 JavasScript。
- *
- * 請參閱 http://dean.edwards.name/packer/usage/ 以了解更多資訊。
- *
- * 注意:
- * # 需要 PHP 5 。使用 PHP 5.1.2、5.1.3、5.1.4、5.2.3 測試
- *
- * # 包裝結果可能與 Dean Edwards
- * 版本不同,但長度相同。原因是 PHP
- * 函數 usort 對陣列進行排序不一定保留
- * 兩個相等成員的原始順序。 Javascript 排序函數
- * 實際上保留了這個順序(但這不是
- * ECMAScript 標準所要求的)。因此,兩個結果中編碼的關鍵字順序可能
- *不同。
- *
- * # 如果您在檔案中使用
- * UTF-8,請小心使用「高ASCII」等級編碼...
- */
-
- class JavaScriptPacker {
- // 常數
- const IGNORE = '$1';
- // 驗證參數
- private $_script = '';
- 私有$_encoding = 62;
- 私有私有。
- 私有$_specialChars = false;
-
- private $LITERAL_ENCODING = array(
- '無' => 0,
- '數字' => 10,
- '正常' => 6🎜> '數字' => 10,
- '正常' => 6 222 ,
- '高ASCII' => 95
- );
-
- 公用函數__construct($_script, $_encoding = 62, $_fastDecode = true, $_specialChars = false)
- {
- {
- $this->_script = $_script 。 「/n」;
- if (array_key_exists($_encoding, $this->LITERAL_ENCODING))
- $_encoding = $this->LITERAL_ENCODING[$_encoding];
- $this->LITERAL_ENCODING[$_encoding];
- $this->_enco = min(this-min( int)$_encoding, 95);
- $this->_fastDecode = $_fastDecode;
- $this->_specialChars = $_specialChars;
- }
-
- public function pack() {
- $this->_addParser('_basicCompression');
- if ($this->_specialChars)
- $this->_addParser('_enencodeChars');
- if ($this->_encoding) if ($this->_encoding)
- $this->_addParser('_encodeKeywords');
-
- // 走吧!
- return $this->_pack($this->_script);
- }
-
- // 應用所有解析程式
- private function _pack($script) {
- for ( $i = 0; isset($this->_parsers[$i]) ; $i++) { $script = call_user_func(array(&$this,$this->_parsers[$i]), $script) ; } 回傳$script; }
-
- // 保留一個解析函數列表,它們會立即執行
- private $_parsers = array();
- 私有函數_addParser($parser) {
- $this->_parsers[ ] = $parser;
- }
-
- // 零編碼- 只刪除空格與註解
- private function _basicCompression($script) {
- $parser = new ParseMaster();
- // 確保安全性
- $parser->escapeChar = '//';
- // 保護字串
- $parser->add('//'[^/'//n//r] */'/', self::IGNORE);
- $parser->add('/"[^"//n//r]*"/', self::IGNORE);
- //刪除註解
- $parser->add ('///////[^//n//r]*[//n//r]/', ' '); $parser->add( '/////); /*[^*]*//*+([^///][^*]*//*+)*////', ' '); // 保護正規表示式
- $parser->add('///s+(///[^/////n//r//*][^/////n//r]*/ //g?i ?)/', '$2'); // 忽略
- $parser->add('/[^//w//x24////'"*)//?:] ///[ ^/////n//r//*][^/////n//r]*///g?i?/', self::IGNORE);
- // 刪除:;;;做某件事();
- if ($this->_specialChars) $parser->add('/;;;[^//n//r]+[//n/ /r]/');
- // 刪除多餘的分號
- $parser->add('///(;;//)/', self::IGNORE); // 保護for ( ;;) 迴圈
- $parser->add('/;+//s*([};])/', '$2');
- // 應用上面的
- $script = $ parser->exec($script);
- // 刪除空格
- $parser->add('/(//b|//x24)//s+(//b|//x24)/' , '$2 $3') ;
- $parser->add('/([+//-])//s+([+//-])/', '$2 $3');
- $ parser->add('///s+/', '');
- // 完成
- return $parser->exec($script);
- }
-
- 私有函數_ encodeSpecialChars($script) {
- $parser = new ParseMaster();
- // 替換:$name -> n,$$名稱-> na
- $parser->add('/((/ /x24+)([a-zA-Z$_]+))(//d*)/',
- array('fn' = > '_替換名稱')
- );
- / / 替換:_name -> _0, 雙底線(__name) 被忽略
- $regexp = '///b_[A-Za-z//d]//w*/';
- // 建構單字列表
- $keywords = $this->_analyze($script, $regexp, '_encodePrivate');
- // 快速參考
- $encoded = $keywords['encoded'];
-
- $parser->add($regexp,
- array(
- 'fn' => '_replace_encoded',
- 'data' => $encoded
- )
- );
- return $parser->exec($script);
- }
-
- private function _encodeKeywords($script) {
- // 轉義腳本中已有的高位元ASCII 值(即字串中)
- if ($this->_encoding >; 62)
- $script = $this->_escape95($script);
- // 建立解析器
- $parser = new ParseMaster();
- $encode = $this->_getEncoder($this->_encoding);
- // 對於高ASCII,不要編碼單一字元低ASCII
- $regexp = ($this->_encoding > 62) ? '/ //w//w+/' : '///w+/';
- // 建立單字清單
- $keywords = $this->_analyze($script, $regexp, $encode);
- $encoded = $keywords['encoded'];
-
- // 編碼
- $parser->add($regexp,
- array(
- 'fn' => '_replace_encoded',
- 'data' => $編碼
- )
- );
- if (emptyempty($script)) return $script;
- else {
- //$res = $parser-> exec($script);
- //$res = $this->_bootStrap($res, $keywords);
- //回傳$res;
- return $this->_bootStrap($parser-> exec($script), $keywords);
- }
- }
-
- private function _analyze($script, $regexp, $encode) {
- // 分析
- // 擷取腳本中的所有單字
- $all = array();
- preg_match_all($regexp, $script, $all);
- $_sorted = array(); // 依頻率排序的單字清單
- $_encoded = array(); // 單字字典->編碼
- $_protected = array(); // 「受保護」單字的實例
- $all = $all[0]; // 模擬全域匹配的javascript 行為
- if (!emptyempty($all)) {
- $unsorted = array(); // 相同的列表,未排序
- $protected = array(); // 「受保護」的單字(單字字典->「單字」)
- $value = array(); // charCode->encoding 字典(例如256->ff)
- $this->_count = array(); // 字數->計數
- $i = count($all); $ j = 0; //$word = null;
- // 計算出現次數- 用於稍後排序
- do {
- --$i;
- $word = '$' 。 $全部[$i];
- if (!isset($this->_count[$word])) {
- $this->_count[$word] = 0;
- $unsorted[$j ] = $word;
- // 為該腳本中所有受保護的單字建立一個字典
- // 這些單字可能會被誤認為編碼
- //if (is_string($encode) && method_exists( $this, $編碼))
- $values[$j] = call_user_func(array(&$this, $encode), $j);
- $protected['$' . $values[$j]] = $j++;
- }
- // 增加單字計數器
- $this->_count[$word]++;
- } while ($i > 0);
- // 準備對單字列表進行排序,首先我們必須保護
- // 也用作代碼的單字。我們為它們分配一個代碼
- // 相當於單字本身。
- // 例如如果「do」落在我們的編碼範圍內
- // 那麼我們儲存keywords["do"] = "do";
- // 這可以避免解碼時出現問題
- $i = count($unsorted);
- do {
- $word = $unsorted[--$i];
- if (isset($protected[$word]) /*!= null* /) {
- $_sorted[$protected[$word]] = substr($word, 1);
- $_protected[$protected[$word]] = true;
- $this->_count[ $word] = 0;
- }
- } while ($i);
-
- // 依頻率對單字排序
- // 注意:javascript 和php 版本的排序可能不同:
- // 在php 手冊中,usort :
- // " 如果兩個成員比較相等,
- // 它們在排序數組中的順序未定義。」
- // 因此最終打包的腳本與Dean 的javascript 版本不同
- // 但等效。
- // ECMAscript 標準不保證這種行為,
- // 因此並非所有瀏覽器(例如可以追溯到
- // 至少 2003 年的 Mozilla 版本)都尊重這一點。
- usort($unsorted, array(&$this, '_sortWords'));
- $j = 0;
- // 因為清單中有「受保護」的單字
- // 我們必須在它們周圍加入排序後的單字
- do {
- if (!isset($_sorted[$i]))
- $_sorted[$i] = substr($unsorted[$j++], 1) ;
- $_encoded[$_sorted[$i]] = $values[$i];
- } while (++$i }
- 傳回陣列(
- 'sorted' => $_sorted,
- 'encoded' => $_encoded,
- 'protected' => $_protected);
- }
-
- private $_count = array( );
- private function _sortWords($match1, $match2) {
- return $this->_count[$match2] - $this->_count[$match1];
- }
-
- // 建立用於載入和解碼的引導函數
- private function _bootStrap($packed, $keywords) {
- $ENCODE = $this->_safeRegExp('$encode/( $ count//)');
- // $packed:打包腳本
- $packed = "'" . $this->_escape($packed) 。 「'」;
- // $ascii:編碼基礎
- $ascii = min(count($keywords['sorted']), $this->_encoding);
- if ($ascii == 0 ) $ascii = 1;
- // $count:腳本中包含的單字數
- $count = count($keywords['sorted']);
- // $keywords:腳本中包含的單字列表
- foreach ($keywords['protected'] as $i=>$value) {
- $keywords['sorted'][$i ] = '';
- }
- // 從字串轉換為陣列
- ksort($keywords['sorted']);
- $keywords = "'" 。 implode('|',$keywords['已排序']) 。 "'.split('|')";
- $encode = ($this->_encoding > 62) ? '_encode95' : $this->_getEncoder($ascii);
- $encode = $this- >_getJSFunction($encode);
- $encode = preg_replace('/_encoding/','$ascii', $encode);
- $encode = preg_replace('/arguments//.callee/','$ encode', $encode);
- $inline = '//$count' . ($ascii > 10 ? '.toString(//$ascii)' : '');
- // $decode:加速解碼的代碼片段
- if ($this->_fastDecode) {
- // 創建解碼器
- $decode = $this->_getJSFunction('_decodeBody) ');
- if ($this- >_encoding > 62)
- $decode = preg_replace('/////w/', '[//xa1-//xff]', $decode);
- // 對較低的ascii 值執行內嵌編碼
- elseif ($ascii $decode = preg_replace($ENCODE, $inline, $decode);
- // 特殊情況:當$count==0 時沒有關鍵字。我想保留
- // 解包函數的基本形狀,所以我會修改程式碼...
- if ($count == 0)
- $decode = preg_replace($this->; _safeRegExp(' ($count)//s*=//s*1'), '$1=0', $decode, 1);
- }
- // 啟動函數
- $unpack = $this-> _getJSFunction('_unpack');
- if ($this->_fastDecode) {
- // 插入解碼器
- $this->buffer = $decode;
- $unpack = preg_replace_callback('/ /{/', array(&$this, '_insertFastDecode'), $unpack, 1);
- }
- $unpack = preg_replace('/"/', "'", $unpack);
- if ($this->_encoding > 62) { // 高位ASCII
- // 去掉正規表示式符合的字邊界
- $unpack = preg_replace('//'////////b /'/s*//+|//+/s*/' ////////b/'/', '', $unpack> }
- if ($ascii > 36 || $ this->_encoding > 62 || $this ->_fastDecode) {
- // 插入編碼函數
- $this->buffer = $encode;
- $unpack = preg_replace_callback('///{/' , array(&$this, '_insertFastEncode'), $unpack, 1);
- } else {
- // 執行內嵌編碼
- $unpack = preg_replace($ENCODE, $inline, $unpack) ; > // 也打包啟動函數
- $unpackPacker = new JavaScriptPacker($unpack, 0, false, true);
- $unpack = $unpackPacker->pack(); //參數
- $params = array($packed, $ascii, $count, $keywords);
- if ($this->_fastDecode) {
- $params[] = 0;
- $params[] = '{}';
- }
- $params = implode(',', $params);
-
- // 整個事情
- return 'eval(' . $unpack . '(' . $params . " ))/n";
- }
-
- 私有$buffer;
- private function _insertFastDecode($match) {
- return '{' . $this->緩衝區。 ';';
- }
- 私有函數 _insertFastEncode($match) {
- return '{$encode=' . $this->緩衝區。 ';';
- }
-
- // 嗯.. ..我需要哪一個?
- private function _getEncoder($ascii) {
- return $ascii >; 10? $ascii > 36? $ascii > 62?
- '_encode95' : '_encode62' : '_encode36' : '_encode10';
- }
-
- // 零編碼
- // 字元:0123456789
- private function _encode10($charCode) {
- return $charCode;
- }
- }
- >🎜 base36 支援
- // 字元:0123456789abcdefghijklmnopqrstuvwxyz
- private function _encode36($charCode) {
- return base_convert($charCode, 10, 36) // 字元:0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
- private function _encode62($charCode) {
- private function _encode62($charCode) {
- $private function _encode62($charCode) {
- $resm = charl_resm = char>==00en) { <.> $res = $this->_encode62((int)($charCode / $this->_encoding));
- }
- $charCode = $charCode % $this->_encoding;
-
- if ($charCode > 35)
- 回傳$res 。 chr($charCode + 29);
- 否則
- 回傳 $res 。 base_convert($charCode, 10, 36);
- }
-
- // 使用高位ASCII 值
- // 字元:?¢£¤¥|§´?a??-?ˉ°± 23′μ?·?1o?? ???àá??????èéê?ìí??D?òó???×?ùú?üYT?àáa??????èéê?ìí??e? òó???÷?ùú?üyt
- 私有函數_encode95($charCode) {
- $res = '';
- if ($charCode >= $this->_encoding)
- $res = $this->_encode95($charCode / $this->_encoding);
-
- 回傳$res 。 chr(($charCode % $this->_encoding) + 161);
- }
-
- private function _safeRegExp($string) {
- return '/'.preg_replace('//$/' , '///$', $string).'/';
- }
-
- 私有函數_encodePrivate($charCode) {
- return "_" . $字元程式碼;
- }
-
- // 保護解析器使用的字元
- private function _escape($script) {
- return preg_replace('/([/////'])/', '// /$1', $script);
- }
-
- // 保護腳本中已有的高位ASCII 字元
- private function _escape95($script) {
- return preg_replace_callback(
- ' /[//xa1-// xff]/',
- array(&$this, '_escape95Bis'),
- $script
- );
- }
- 私有函數_escape95Bis($ match) {
- return '/x'.((string)dechex(ord($match)));
- }
-
-
- private function _getJSFunction($aName) {
- if (define('self::JSFUNCTION'.$aName))
- return Constant('self::JSFUNCTION '.$aName);
- 否則
- 回傳'';
- }
- }
-
- // 使用的JavaScript 函數。
- // 注意:在 Dean 的版本中,這些函數將
- // 轉換為 'String(aFunctionName);'。
- // 這個內部轉換完成了原始程式碼,例如:
- // 'while (aBool) anAction();'轉換成
- // 'while (aBool) { anAction(); }'。
- // 下面的 JavaScript 函數已修正。
-
- // 解包函數- 這是引導函數
- // 從該打包例程中提取的資料將傳遞給
- // 在目標中解碼時此函數
- //注意! : 沒有「;」最終的。
- const JSFUNCTION_unpack =
- 'function($packed, $ascii, $count, $keywords, $encode, $decode) {
- while ($count--) {
- if ($keywords[ $count]) {
- $packed = $packed.replace(new RegExp(/'////b/' + $encode($count) + /'////b/', /'g/ '), $keywords[$count]);
- }
- }
- 回傳$packed;
- }';
- /*
- 'function($packed, $ascii, $ count, $keywords, $encode, $decode) {
- while ($count--)
- if ($keywords[$count ])
- $packed = $packed.replace(new RegExp(/' ////b/' + $encode($count) + /'////b/', /'g/'), $關鍵字[$計數]);
- 回傳$packed;
- }';
- */
-
- // 插入解包器的程式碼片段加速解碼
- const JSFUNCTION_decodeBody =
- //_decode = function() {
- // 瀏覽器是否支援String.replace
- // 替換值是一個函數?
- ' if (!/'/'.replace(/^/, String)) {
- // 解碼我們需要的所有值
- while ($count--) {
- $decode[ $encode($count)] = $keywords[$count] || $編碼($計數);
- }
- // 全域替換函數
- $keywords = [function ($encoded) {return $decode[$encoded]}];
- // 通用匹配
- $encode = function () {return / '////w+/'};
- // 重置循環計數器- 我們現在正在進行全域替換
- $count = 1;
- }
- ';
- //};
- /*
- ' if (!/'/'.replace(/^/, String)) {
- // 解碼我們需要的所有值
- while ($count--) $decode [$encode($count)] = $keywords[$count] || $編碼($計數);
- // 全域替換函數
- $keywords = [function ($encoded) {return $decode[$ encoded]}];
- // 通用匹配
- $encode = function () {return/'////w+/'};
- // 重置循環計數器- 我們現在正在進行全域替換
- $count = 1;
- }';
- */
-
- // 零編碼
- // 字元:0123456789
- const JSFUNCTION_encode10 =
- 'function($unc. charCode) {
- return $charCode;
- }';//;';
-
- // 固有的Base36 支援
- // 字元:0123456789abcdefghijklmnopqrstuvwklmnopqrstuvw; 'function($charCode) {
- return $charCode.toString(36);
- }';//;';
-
- //搭乘base36騎行並加上上情況alpha字符
- //字元:0123456789ABCDEFGHIJKLMNOPQRMNOPQRSTUVWXYZABCDEFGHIJKLMNNOPQRMNOPQRSTUVWXYZERSTUVWXYZ charCode 35 ? String. fromCharCode($charCode + 29) : $charCode.toString(36));
- }';
-
- // 使用高位元ASCII 值
- // 字元: ?¢£¤¥|§? a??-?ˉ°±23′μ?·?1o??????àá ??????èéê?ìí??D?òó???×?ùú?üYT?àáa???? ??èéê?ìí??e?òó???÷?ùú?üyt
- const JSFUNCTION_encode95 =
- 'function($charCode) {
- return ($charCode String.fromCharCode($charCode % _encoding + 161);
- }';
-
- }
-
- class ParseMaster {
- public $ignoreCase = false;
- public $escapeChar = '';
-
- // 常數
- const EXPRESSION = 0;
- const 替換= 1;
- const 長度= 2
- // 用來決定巢狀等級
- private $GROUPS = '///(/';//g
- private $SUB_REPLACE = '///$//d/';
- 私人$INDEXED = '/^//$//d+$/';
- 私有$TRIM = '/([/'"])//1//.(.*)//.// 1//1$/';
- 私有$ESCAPE = '////./';//g
- 私有$QUOTE = '//'/';
- 私有$DELETED = '/ //x01[^//x01]*//x01/';//g
-
- public function add($expression, $replacement = '') {
- // 統計子數表達式
- // - 增加一個,因為每個模式本身就是一個子表達式
- $length = 1 + preg_match_all($this->GROUPS, $this->_internalEscape((string)$expression), $ out) ;
-
- // 僅處理字串$replacement
- if (is_string($replacement)) {
- // 該模式是否處理子表達式? this->SUB_REPLACE, $replacement)) {
- // 一個簡單的查找? (例如“$2”)
- if (preg_match($this->INDEXED, $replacement)) {
- // 儲存索引(用於快速擷取匹配的字串)
- $replacement = (int ) (substr($替換, 1)) - 1;
- } else { // 一個複雜的查找(例如“Hello $2 $1”)
- // 建立一個函數來執行查找
- $quote = preg_match ($this->QUOTE, $this->gt ;_internalEscape($replacement))
- ? '"' : "'";
- $replacement = array(
- 'fn' => '_backReferences' ,
- 'data' => array(
- 'replacement' => $替換,
- 'length' => $length,
- 'quote' => $quote
- )
- );
- // 提交修改後的參數
- if (!emptyempty($expression)) $this->_add($expression, $replacement, $length);
- else $this->_add('/^$/', $replacement, $length);
- }
-
- public function exec($string) {
- // 執行全域替換
- $this->_escaped = array();
-
- // 模擬 Dean 的 _patterns.toSTring
- $regexp = '/';
- foreach ($this->_patterns as $reg) {
- $regexp .= '(' . substr($reg[self::EXPRESSION], 1, -1) . ')|';
- }
- $regexp = substr($regexp, 0, -1) 。
- $regexp .= ($this->ignoreCase) ? ‘我’:’’;
-
- $string = $this->_escape($string, $this->escapeChar);
- $string = preg_replace_callback(
- $regexp,
- array(
- &$this,
- '_replacement'
- ),
- $string
- );
- $string = $this->_unescape($string, $this->escapeChar);
-
- return preg_replace($this->DELETED, '', $string);
- }
-
- public function reset() {
- // 清除模式集合,方便可以重複使用該物件
- $this->_patterns = array();
- }
- // private
- private $_escaped = array(); // 轉義字元
- private $_patterns = array(); // 依索引儲存的模式
-
- // 建立新模式並加入模式集合
- private function _add() {
- $arguments = func_get_args();
- $this->_patterns[] = $arguments;
- }
-
- // 這是全域替換函數(相當複雜)
- private function _replacement($arguments) {
- if (emptyempty($arguments)) return '';
-
- $i = 1; $j = 0;
- // 循環遍歷模式
- while (isset($this->_patterns[$j])) {
- $pattern = $this->_patterns[$j++];
- // 我們有結果了嗎? ::替代品];
-
- if (is_array($replacement) && isset($replacement['fn'])) {
-
- if (isset($replacement['data'])) $this->; = 平面圖$替換['數據'];
- return call_user_func(array(&$this, $replacement['fn']), $arguments, $i);
-
- } elseif (is_int($replacement)) {
- return $arguments[$replacement + $i];
-
- }
- $delete = ($this->escapeChar == '' ||
- strpos($arguments[$i], $this->escapeChar) === false)
- ? > } else {
- $i += $pattern[self::LENGTH];
- }
- }
- }
-
- private function _backReferences($match, $offset) {
- $replacement = $this->buffer['replacement'];
- $quote = $this->buffer['quote'];
- $i = $this->buffer['length'];
- while ($i) {
- $replacement = str_replace('$'.$i--, $match[$offset + $i], $replacement);
- }
- 回傳 $replacement;
- }
-
- 導管函數 _replace_name($match, $offset){
- $length = strlen($match[$offset + 2]);
- $start = $length - max($length - strlen($match[$offset + 3]), 0);
- 回傳 substr($match[$offset + 1], $start, $length) 。
- }
-
- private function _replace_encoded($match, $offset) {
- return $this->buffer[$match[$offset]];
- }
-
-
- // php : 我們無法將附加資料傳遞給preg_replace_callback,
- // 且我們無法在create_function 中使用&$this,所以讓我們進入較低階
- private $ buffer;
-
- // 編碼轉義字元
- private function _escape($string, $escapeChar) {
- if ($escapeChar) {
- $this->buffer = $this-Char return preg_replace_callback(
- '///' . $escapeChar . '(.)' .'/',
- array(&$this, '_escapeBis'),
- $string
- ) ;
-
- } else {
- return $string;
- }
- }
- 私有函數_escapeBis($match) {
- $this->_escaped[] = $match [1];
- return $this->buffer;
- }
-
- // 解碼轉義字元
- private function _unescape($string, $escapeChar) {
- if ($ escapeChar) {
- $regexp = '/'.'/ /'.$escapeChar.'/';
- $this->buffer = array('escapeChar'=> $escapeChar, 'i' => 0 );
- return preg_replace_callback
- (
- $regexp,
- array(&$this, '_unescapeBis'),
- $string
- );
-
- } elsel.
- return $string;
- }
- }
- private function _unescapeBis() {
- if (isset($this->_escaped[$this->buffer['i']])
- && $this ->_escaped[$this->buffer['i']] != '')
- {
- $temp = $this->_escaped[$this->buffer['i' ] ];
- } else {
- $temp = '';
- }
- $this->buffer['i']++;
- 回傳$this->buffer['escapeChar '] 。 $暫時;
- }
-
- private function _internalEscape($string) {
- return preg_replace($this->ESCAPE, '', $string);
- }
- }
- }
- }
} } } } } } } } } } } } - }
- }
- }
- }
- }
- }
- }
- }
- }
- }
- } ?>
-
-
- 複製程式碼
-
-
-
-
- 2、執行壓縮的PHP檔 pack_js_file.php
-
-
-
-
-
-
需要'tom-class.JavaScriptPacker.php';
$t1 = microtime(true); $php'; $t1 = microtime(true); $php'; $t1 = microtime(true); $php'; $t1 = microtime(true); $php'; | $t1 = microtime(true);
$php'; source_dir = realpath(dirname(__FILE__)."/..")."/common/script_unpacked";