2011-05-02 24 views
2

我們的頁面上有一個TinyMCE腳本,允許用戶將Word中的文本段粘貼到其中。我們注意到,從Word文檔粘貼,我們得到了一些額外的,不必要的CSS像文字前綴是代碼,它看起來像JavaScript正則表達式

@font-face 
{ 
    font-family: "Arial"; 
} 
@font-face 
{ 
    font-family: "Cambria Math"; 
} 
@font-face 
{ 
    font-family: "Cambria"; 
} 
p.MsoNormal, li.MsoNormal, div.MsoNormal 
{ 
    margin: 0in 0in 0.0001pt; font-size: 11pt; font-family: Arial; 
} 
strong { } 
.MsoChpDefault 
{ 
    font-size: 10pt; 
    font-family: Cambria; 
} 
div.WordSection1 
{ 
    page: WordSection1; 
} 

我們目前有一個使用正則表達式表達刪除這個PHP腳本數據保存之前的數據。但是,我們希望在粘貼時刪除此數據,以便用戶永遠不會接觸到它。

我已經添加下面的正則表達式表達到TinyMCE中的onPaste插件

/@font(.*)\{(.*)\}/i 

但是,它不會刪除任何東西。如果我刪除了最後一個字面括號\},它將刪除部分代碼,但不是整個東西,所以表達式似乎在正確的位置,但是,它似乎沒有正確地形成。

基本上,我在尋找一個有效的JavaScript正則表達式,它將刪除從@font到最後一個大括號}的所有內容。

回答

3

Javascript正則表達式中的點選擇符(.)與除了換行符之外的所有字符匹配。不幸的是,在Javascript中沒有s標誌來打開點匹配換行符。取而代之的是使用字符集[\s\S]來匹配任何空白字符(包括換行符)和任何非空白字符。因此下面的正則表達式將從@font刪除一切到最後花括號}

yourText = yourText.replace(/@font[\s\S]*\{[\s\S]*\}/i,''); 

See working example →

+1

完美,我想這是不是線路中斷或at符號,只是無法找出哪一個是造成它。謝謝! – shmeeps 2011-05-02 16:07:27

0

這只是正常

"@font-face {...}".match(/@font.*?{.*?}/g); 
["@font-face {...}"] 

使用?作爲*是一個貪婪的量詞是很重要的。 不這樣做會導致單個匹配從第一個@font開始,到最後一個}結束。

0

我同意肖恩·金賽,但根據正則表達式引擎,你可能需要考慮新的生產線。如果您不得不擔心換行符和回車,我會使用[\s\S]而不是.來捕獲這些字符。下面是一個例子,你可以嘗試在jsbin或其他動態JavaScript測試儀:

// An array of lines of the css code. 
var cssCode = []; 
cssCode.push('@font-face'); 
cssCode.push('{'); 
cssCode.push(' font-family: "Arial";'); 
cssCode.push('}'); 
cssCode.push('@font-face'); 
cssCode.push('{'); 
cssCode.push(' font-family: "Cambria Math";'); 
cssCode.push('}'); 

// A string with new line characters separating each line in the array. 
cssCode = cssCode.join("\n"); 

// Show the matches. 
alert(cssCode.match(/@font[\s\S]*?{[\s\S]*?}/g)); 
+0

需要非貪婪的匹配,以免意外清除額外的CSS代碼。 – 2011-05-02 16:03:57