jQuery - Parse&转换标记文本

时间:2011-08-25 12:25:24

标签: javascript jquery parsing

使用jQuery如何转换此文本

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>

2 个答案:

答案 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('');

我不保证这个状态机在所有情况下都能正常工作,但它适用于您的测试字符串。

答案 1 :(得分:-1)

那不是更好吗?

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