仅替换 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, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
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, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
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, "&")
.replace(/>/g, ">")
.replace(/</g, "<")
.replace(/"/g, """)
.replace(/'/g, "'");
}
}
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, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
}
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
所以我创建了这个函数来替换字符串中的特殊字符。主要目的是替换 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, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
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, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
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, "&")
.replace(/>/g, ">")
.replace(/</g, "<")
.replace(/"/g, """)
.replace(/'/g, "'");
}
}
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, "&").replace(/>/g, ">").replace(/</g, "<").replace(/"/g, """).replace(/'/g, "'");
}
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