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

replace multiple characters that's inside of a bbcode tag only, and not effect any other text that is outside of the bbcode

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

目标是替换以下特殊字符:

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

还应该提到,当我说代码=任何意思时,它可以是任何东西。可以是 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

是否要提取条形码内的文本并应用此正则表达式, 您可以使用 exec 将替换应用于代码中的内容, 可以使用 捕获组和反向引用 查看更多 link 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);

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 Stribiżew的回答,可以验证正则表达式,所以bbcode是any

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([=12=], $group_match1, $group_match2, $group_match3) { return $group_match1 + myObj.replaceSpecial($group_match2) + $group_match3; }) );

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

如果您没有嵌套 code 标签,您可以使用

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

或者,如果您发现此正则表达式性能有问题,请将其替换为根据 :

编写的等效项
/(\[code=[^\]]*])([^[]*(?:\[(?!\/code])[^[]*)*)(\[\/code])/gi

参见 regex demo (and the optimized regex demo)。

详情

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

像这样在 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([=12=], , , ) { return  + replaceSpecial() + ; }) );

注意:如果您必须在 [code=[/code] 之间排除 [code=,则需要调整正则表达式至

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

this regex demo