因此,我具有创建的该函数来替换字符串内的特殊字符。主要目的是替换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, "&");
str = str.replace(/>/g, ">");
str = str.replace(/</g, "<");
str = str.replace(/"/g, """);
str = str.replace(/'/g, "'");
return str;
}
但是我将如何重写它,以便它仅替换以下代码中的文本:[code = any]此处的某些代码[/ code]就是这样。如果有人对此有解决方案,那就太好了。
感谢您的宝贵时间, 乔恩W
答案 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);
请参阅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 Stribiew的回答,可以验证正则表达式,以便bbcode是任意的
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($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, "&").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($0, $1, $2, $3) { return $1 + replaceSpecial($2) + $3; }) );
内使用它:
[code=
注意:如果您必须在[code=
和[/code]
之间排除/(\[code=[^\]]*])([^[]*(?:\[(?!\/?code[\]=])[^[]*)*)(\[\/code])/gi
,则需要将正则表达式调整为
z-index
请参见this regex demo。