如何解决Javascript .replace正则表达式替代
当前我使用这个:
function parseFormat(text) {
text = text.replace(/[\_]{2}([^\_]+)[\_]{2}/g,'<u>$1</u>');
text = text.replace(/[\*\_]{2}([^\*\_]+)[\*\_]{2}/g,'<b>$1</b>');
text = text.replace(/[\*\_]{1}([^\*\_]+)[\*\_]{1}/g,'<i>$1</i>');
text = text.replace(/[\~]{2}([^\~]+)[\~]{2}/g,'<del>$1</del>');
return text;
}
要解析:agent_messages.forEach(e => e.innerHTML = parseFormat(e.innerHTML));
我希望在上面使用其他类型的组合。
赞:
-
!@#
为粗体 -
$%^
下划线 -
&*(
表示斜体 -
)_+
删除线
因此,对于粗体,应为:!@#粗体!@#(= 粗体)
有人可以提供此代码帮助吗?这很复杂。
解决方法
您的方法存在的一个问题是(使用“新”定界符)获得此输入后会发生什么?
正常!@#粗体&*(粗体!@#斜体&*(正常
这将是您的输出:
正常粗体粗斜体斜体正常
由于标记交叉,因此该HTML无效。
相反,您需要某种解析器。一个非常基本的标签将查找单个有效标签,然后递归重新解析其内容。例如:
const tags = {
"!@#": "b","$%^": "u","&*(": "i",")_+": "del"
};
const regexSanity = /[-[\]{}()*+?.,\\^$|#\s]/g; // https://stackoverflow.com/a/9310752/507674
const regex = new RegExp(
"(" + Object.keys(tags).map(
token => token.replace(regexSanity,'\\$&')
).join("|") + ")(.*?)\\1","g");
const parse = input=>
input.replace(
regex,(_,tag,content) => `<${tags[tag]}>${parse(content)}</${tags[tag]}>`
);
console.log(parse("normal !@# bold &*( bold-italic !@# italic &*( normal"));
请注意,在此示例中,由于斜体的标签与粗体标签交叉,因此不对斜体进行解析。这样可以强制正确的嵌套。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。