我有textarea
用户键入他的代码和div
标记,用于显示网页上的显示方式。我使用自定义标记来格式化用户代码,例如[b]bold text[/b]
而不是<b>bold text </b>
我使用string.replace()
函数将自定义标记替换为原始到标记预览用户代码。但是如何使用正斜杠(/
)作为匹配模式
我已经走过了一对知道方法。我试过了
string.replace(/[\/b]/gi,"</b>");
string.replace(/[\x2Fb]/gi,"</b>");
string.replace(/[\x2F b]/gi,"</b>");
以下是我在项目中如何实现的代码
//Helper Function
function $(id){
return document.getElementById(id);
}
//Helper Variables//
//Display Preview of question
function render(){//
var question_content = $("question_content").value;
//Sanitizing data//
var entitles = {//List of all Html entitles & custum entitles
'<':"<",
'>':">",
'\n':"<br>",
'[b]':"<b>",
'[/b]':"</b>",
'[i]':"<i>",
'[/i]':"</i>",
'[code]':"<code class='prettyprint'>",
'[/code]':"</code>"
}
question_content = question_content.replace(/<|>|\n|[b]|[\/b]/gi, function (html_ent){return entitles[html_ent];});
//question_content = question_content.replace(/'/, "</b>");
var preview = $("preview");
preview.innerHTML = question_content;
//prettyPrint();
}
答案 0 :(得分:2)
实际上,如果你没有忘记转义括号,第一种方法会奏效:
]
但是,只有开放的应该逃脱;正则表达式引擎足够聪明,可以区分var codes = ['b', 'i', 'code'];
// here goes a little hack to enable special decoration for some elements
codes.code = 'class="prettyprint"';
var string = 'abc[b]abc[/b]da[code]s[/code][something]d';
string.replace(/\[(\/?)([a-z]+)]/gi, function(m, p1, p2) {
return codes.indexOf(p2) !== -1
? '<' + p1 + p2 + (!p1 && p2 in codes ? ' ' + codes[p2] : '') + '>'
: m
});
作为文字符号和metasymbol(关闭该字符类子表达式)。
总的来说,您可以使用以下内容简化代码:
var decorators = {
b: '', i: '',
code: 'class="prettyprint"'
};
var string = 'abc[b]abc[/b]da[code]s[/code][something]d';
string.replace(/\[(\/?)([a-z]+)]/gi, function(m, p1, p2) {
return p2 in decorators
? '<' + p1 + p2 +
(!p1 && decorators[p2] ? ' ' + decorators[p2] : '') + '>'
: m;
});
使用字典(对象)表达相同的算法肯定是可能的,如下所示:
{{1}}