2011-08-25 76 views

回答

-1

難道不是更好嗎?

str.replace(/\[\[(.*?)\]\]/g, '<span class="gist">$1</span>'); 
+0

對我的建議(對我有用)和我的選票有什麼評論? –

2

只需用javascript:

var string = "The quick brown [[fox]] jumps over the lazy [[dogs back]]" 
string = string.replace(/\[\[/g, '<span class="gist">').replace(/\]\]/g, '</span>'); 

這是使用正則表達式查找[[<span class="gist">替換它,然後找到]]</span>更換。因爲[]都是正則表達式中的特殊字符,所以它們必須用反斜槓(\)轉義,並且我們希望替換爲全局的(例如:替換多個實例),這使得我們可以:/\[\[/g/\]\]/g


如果您需要處理未閉合的括號,你必須去與不同的東西,像一個狀態機:

var string = "The quick]] brown [[fox]] jumps over the lazy [[dogs [[back]]"; 
var state = 'NO_TAG'; 
var parts = []; 
for(var i = 0; i < string.length; i += 1) { 
    if(string[i] === "[" && string[i+1] === "[" && state === 'NO_TAG') { 
     parts.push('<span class="gist">'); 
     i += 1; 
     state = 'TAG'; 
    } else if (state === 'TAG' && string[i] === "[" && string[i+1] === "[") { 
     i += 1; // ignore start brackets if we are in a tag. 
    } else if (state === 'TAG' && string[i] === "]" && string[i+1] === "]") { 
     parts.push('</span>'); 
     i += 1; 
     state = 'NO_TAG'; 
    } else if (state === 'NO_TAG' && string[i] === ']' && string[i+1] === ']') { 
     i += 1; // ignore end brackets if we are not in a tag. 
    } else { 
     parts.push(string[i]); 
    } 
} 

string = parts.join(''); 

我不能保證這個狀態機將工作在所有情況,但它適用於你的測試字符串。

+0

這也是我的建議。 –

+0

問題是如果有未關閉的括號會產生未封閉的HTML。看看我更新的問題。 –

+0

那麼,你不需要正則表達式來替換一個集合,但沒有正則表達式,你不能做全局替換,所以第二組括號不會被改變。至於未關閉的HTML,我唯一能說的是確保不要有未關閉的括號。我能想到的唯一方法就是解決這個問題,如果你永遠不想附上多個單詞,那麼你可以用一個狀態機(或者我認爲的空間分割......)來完成,然後關閉標籤單詞的結尾,無論您是否找到右括號。 –