2011-03-02 82 views
1

我想decomment我// comments在我的JavaScript和PHP的preg_replace(),並提出了其的preg_replace應該做以下幾點:如何使用此preg_replace解除JavaScript代碼註釋?

1.當一個新行註釋開始,刪除整行: // COMMENTS .....

2.當評論是半路腳本後面,後1個TAB //刪除註釋部分 exampleScript(); // (1space) comments

3.不要匹配HTTP //的://

這pregr eplace做了上述工作,然而,它目前刪除3行代碼//在其中。(請參閱下面的錯誤匹配標題),它應該跳過。

$buffer = preg_replace('/(?<!http:)\/\/\s*[^\r\n]*/', '', $buffer); 

良好匹配

//something

// something *!&[email protected]#^hjksdhaf

功能(); // comment

錯誤匹配

(/\/\.\//) 
"//" 
"://" 

所以,我怎麼能過濾這三個錯誤的匹配出來,如何更改下面的正則表達式?

(?<!http:)\/\/\s*[^\r\n]* 

PS,我不希望使用別人的代碼縮小器/框架與自己的開銷。現在就是我自己的。

回答

6

爲什麼不使用預先存在的JavaScript縮小器,如YUI Compressor(PHP綁定here)?


如果你真的設置寫自己的,必須通過source code看看,看看它是如何做。
簡版:正確的方法是使用適當的解析器/標記器方法。

+0

感謝對此事發表評論,但我真的想用我自己的東西了現在 – Sam 2011-03-02 03:06:30

+2

@Sam:如果我問爲什麼,你介意嗎?你使用這個作爲一個學習項目嗎?否則,這聽起來像[NIH綜合徵](http://en.wikipedia.org/wiki/Not_Invented_Here#In_computing)給我。 – 2011-03-02 03:09:15

+0

第一個:我正在學習,現在在我的崇拜新手時代。我一定是IHBLRIA-man:'發明在這裏,但是讓我們重新創造它' – Sam 2011-03-02 03:29:31

6

JavaScript的語法是一個上下文無關語法(我相信它是LL(1)可分解的)。 它不能用正則表達式進行分析。

在可計算性理論中的形式語言理論中,有一個結果被稱爲抽象引理,它證明了你不能用正則表達式解析任意上下文無關文法。

問題的要點是:你不能只查找字符串//,因爲它可能包含在其他有效的代碼中,例如,一個字符串。你不能只在兩個引號內尋找//,因爲那樣你會得到像alert('no!') // can't do it這樣的誤報,其中文字) // can在技術上被包含在兩個'之間。相反,你必須檢測字符串開始和結束的位置。更糟糕的是,一種類型的字符串可以嵌套在另一種類型的字符串中,而字符串(甚至是半開放的字符串)可以嵌套在註釋中!

沒有簡單的通用解決方案 - 像字符串,括號,圓括號等JavaScript語法元素可以任意嵌套多層。準確檢測任何句法元素開始和結束的唯一方法是正確解析您可能會遇到的句法元素。

正確的答案是使用實際的解析器。

+0

感謝丹尼爾或者這樣有趣的定理。這使我的整個方法成爲一個笑話,未來的方式。 (現在,它仍然完美無缺地工作) – Sam 2011-03-02 03:59:33