仅替换bbcode标记内的多个字符,而不影响bbcode以外的任何其他文本

时间:2019-03-17 03:45:13

标签: javascript regex bbcode

因此,我具有创建的该函数来替换字符串内的特殊字符。主要目的是替换BBCode标记内的那些特殊字符([code = any]我要显示的我的代码[/ code]),但那时,是否替换其余字符并不重要BBcode标记之外的字符串。但是现在我遇到了替换BBcode标记之外的HTML标记的问题。因此,我试图为此提出解决方案,但到目前为止还没有运气。

目标是替换其中的特殊字符:

[code=any]some code inside of here[/code]

还应该提到当我说code = any时,它可以是任何东西。可以是HTML,CSS,PHP,JS [a-z-A-Z-0-9]。

更像

[code=[a-z-A-Z-0-9]<h1>some html insode of the bbcode to be replace</h1>[/code]

我当前的功能很简单。只需一些基本的正则表达式:

replaceSpecial : function(str) {

str = str.replace(/&/g, "&amp;");
str = str.replace(/>/g, "&gt;");
str = str.replace(/</g, "&lt;");
str = str.replace(/"/g, "&quot;");
str = str.replace(/'/g, "&#039;");

return str;
}

但是我将如何重写它,以便它仅替换以下代码中的文本:[code = any]此处的某些代码[/ code]就是这样。如果有人对此有解决方案,那就太好了。

感谢您的宝贵时间, 乔恩W

2 个答案:

答案 0 :(得分:2)

您是否要提取条形码中的文本并应用此正则表达式, 您可以使用exec来将替换应用于代码内部, 可以使用捕获组和反向引用 查看更多链接https://www.regular-expressions.info/refcapture.html

在这种情况下,仅获取bbcode内部的文本并进行处理

let code = "[code=any]<h1>hello and bye</h1>e[/code]";
//extract only texto inside bbcode
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
//get <h1>hello</h1>e
let replacement = myObj.replaceSpecial(match);

enter image description here

请参阅https://regex101.com/r/KGCWmq/1

只有当您想要获取时,如果您要替换,就可以使用替换功能。

var myObj = {
    replaceSpecial : function(str) {
        str = str.replace(/&/g, "&amp;");
        str = str.replace(/>/g, "&gt;");
        str = str.replace(/</g, "&lt;");
        str = str.replace(/"/g, "&quot;");
        str = str.replace(/'/g, "&#039;");
        return str;
    }
};
let code = "[code=any]<h1>hello and bye</h1>e[/code]";
let match = /\[code\=any\](.+)\[\/code\]/g.exec(code)[1];
let replacement = myObj.replaceSpecial(match);
let string = code.replace(/\[code\=any\](.+)\[\/code\]/,"[code=any]"+replacement+"[/code]")

已更新

根据Wiktor Stribiew的回答,可以验证正则表达式,以便bbcode是任意的

myObj = {
  replaceSpecial : function(str) {
     return str.replace(/&/g, "&amp;")
               .replace(/>/g, "&gt;")
               .replace(/</g, "&lt;")
               .replace(/"/g, "&quot;")
               .replace(/'/g, "&#039;");
  }
}

var s = '[code="HTML"]<h1>Hello</h1>[/code]';
var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi;
console.log( s.replace(regex, function($0, $group_match1, $group_match2, $group_match3) { return $group_match1 + myObj.replaceSpecial($group_match2) + $group_match3; }) );

希望我能对您有所帮助,如果不是您期望的那样,请发表评论并编辑问题

答案 1 :(得分:1)

如果您没有嵌套的/(\[code=[^\]]*])([^]*?)(\[\/code])/gi 标签,则可以使用

/(\[code=[^\]]*])([^[]*(?:\[(?!\/code])[^[]*)*)(\[\/code])/gi

或者,如果发现此正则表达式性能存在问题,则将其替换为根据unroll-the-loop principle编写的等效符号:

(\[code=[^\]]*])

请参见regex demo(和the optimized regex demo)。

详细信息

  • [code=-组1:],然后是]以外的任何0+字符,然后是([^]*?)
  • *?-第2组:任意0个或多个字符,且尽可能少((\[\/code])是*非贪婪的量词)
  • [/code]-第3组:String#replace子字符串。

像这样在function replaceSpecial(str) { return str.replace(/&/g, "&amp;").replace(/>/g, "&gt;").replace(/</g, "&lt;").replace(/"/g, "&quot;").replace(/'/g, "&#039;"); } var s = '[code="JS"]<p align="center">D&elete the "Go" \'icon\'.</h1>[/code]'; var regex = /(\[code=[^\]]*])([^]*?)(\[\/code])/gi; console.log( s.replace(regex, function($0, $1, $2, $3) { return $1 + replaceSpecial($2) + $3; }) );内使用它:

[code=

注意:如果您必须在[code=[/code]之间排除/(\[code=[^\]]*])([^[]*(?:\[(?!\/?code[\]=])[^[]*)*)(\[\/code])/gi ,则需要将正则表达式调整为

z-index

请参见this regex demo