使用jQuery我怎麼能本文jQuery的 - 解析和轉換markedup文本
The quick]] brown [[fox]] jumps over the lazy [[dogs [[back]]
轉換成
The quick]] brown <span class="gist">fox</span> jumps over the lazy <span class="gist">dogs [[back</span>
?
使用jQuery我怎麼能本文jQuery的 - 解析和轉換markedup文本
The quick]] brown [[fox]] jumps over the lazy [[dogs [[back]]
轉換成
The quick]] brown <span class="gist">fox</span> jumps over the lazy <span class="gist">dogs [[back</span>
?
難道不是更好嗎?
str.replace(/\[\[(.*?)\]\]/g, '<span class="gist">$1</span>');
只需用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('');
我不能保證這個狀態機將工作在所有情況,但它適用於你的測試字符串。
這也是我的建議。 –
問題是如果有未關閉的括號會產生未封閉的HTML。看看我更新的問題。 –
那麼,你不需要正則表達式來替換一個集合,但沒有正則表達式,你不能做全局替換,所以第二組括號不會被改變。至於未關閉的HTML,我唯一能說的是確保不要有未關閉的括號。我能想到的唯一方法就是解決這個問題,如果你永遠不想附上多個單詞,那麼你可以用一個狀態機(或者我認爲的空間分割......)來完成,然後關閉標籤單詞的結尾,無論您是否找到右括號。 –
對我的建議(對我有用)和我的選票有什麼評論? –