2016-01-05 58 views
0

我有以下功能縮小:PHP minify函數似乎破壞了內聯JS?

public static function minify($buffer) 
{ 
    $search = array(
     '/\>[^\S ]+/s', 
     '/[^\S ]+\</s', 
     '/(\s)+/s' 
    ); 
    $replace = array(
     '>', 
     '<', 
     '\\1' 
    ); 
    $buffer = preg_replace($search, $replace, $buffer); 
    return $buffer; 
} 

此功能是爲了來縮小我的HTML輸出使用ob_start()。該功能取自:https://stackoverflow.com/a/6225706/4601581

這個函數似乎破壞了我的一些JS。例如:一個按鈕i單擊以執行一些JS:

<button type="button" class="btn btn-<?= Config::$ELEMENT_COLOR ?> btn-block" onclick="addLastInput(<?= $mask->getId() ?>)">Do it</button> 

$id我給addLastInput是一個簡單的數字,從$mask->getId()服用。

我也有這一點的JS代碼來填充一些數據數組:

<script>lastSubmissionData[<?=$mask->getId()?>] = '<?=json_encode($lastSubmissionData)?>';</script> 

最後我的JS功能其實我是想用我給出參數(標識)執行和數據陣列:

function addLastInput(maskId) { 
     var data = lastSubmissionData[maskId]; 
     for (var i = 0; i < data.length; i++) { 
      // TODO 
     } 
    } 

無論何時我只加載頁面,它只是告訴我在Chrome控制檯中Uncaught SyntaxError: Unexpected end of input。每當我這樣做,不使用minify函數和完全取消ob_start(),它只是工作,我可以使用它。

結論:minify函數似乎將我的內聯JS制動爲連接的SO答案中的註釋。問題:我該如何解決這個問題?我甚至google搜索其他縮小解決方案,如:https://gist.github.com/tovic/d7b310dea3b33e4732c0

所有這些似乎都不能通過打破我的網站工作。什麼是最好的解決方案,讓我使用我的JS代碼,並仍然縮小我的HTML輸出?

+1

把你的JavaScript在外部文件中,問題就迎刃而解了。另一方面,整個庫都是爲了正確處理縮小而編寫的,而且它們有時還會失敗,只是用一些正則表達式來做這件事肯定會有問題。 – adeneo

+0

將js代碼放入js文件中,根本不要使用內嵌JavaScript。 – baao

+0

@Michael:問題是,我只能將函數本身放在extern .js文件中。不是真的。因爲在頁面加載時,我的PHP代碼實際上會生成大量寫入JS變量的數據以備後用。我不能把它放到extern .js文件中。 – BoA456

回答

1

不要使用這個minify()函數。它壞了。

此函數最終會刪除內嵌Javascript代碼中的一些語義上有意義的換行符,例如出現在單行註釋末尾的換行符。 (例如,它將您的示例Javascript函數轉換爲以{ // TODO } }結尾的單行。)

此函數也會破壞一些HTML結構。特別是,它會破壞<pre>標籤的內容,因爲它不承認在這種情況下空白是重要的。

(這兩個需要注意的地方在你從這個代碼後高度upvoted意見提到,順便!)