在正则表达式中使用正斜杠作为匹配模式

时间:2015-09-29 18:30:40

标签: javascript regex

我有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
        '<':"&lt;",
        '>':"&gt;",
        '\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();
}

1 个答案:

答案 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}}