javascript - 替换非 html 并用正确的语法替换它
问题描述
我有一个源程序,它提供带有非 html 标签和不正确语法的文本。例如:
the <H>quick</> brown fox.
the <U>quick</> brown fox.
<H><U>The</> quick brown fox.
<H><U>The</> quick </> brown fox.
结果应该是这样的:
敏捷的棕色狐狸。
敏捷的棕色狐狸。
敏捷的棕色狐狸。
敏捷的 棕色狐狸。
所以使用的标签不是 html-valid,也不是应该关闭的。我正在努力让它在 javascript 中工作。
从以下内容开始:
var s = document.getElementById('root').innerHTML;
s = s.replace("<H>", "<b>");
s = s.replace("<h>", "<b>");
s = s.replace("</>","</b>");
document.getElementById('root').innerHTML = s;
root 是所有包含的 div。标签将出现在具有“标签组件”类的 div 中,将有多个具有“标签组件”类的 div(因此页面上出现多次错误标签)。
我怎样才能最好地解决这个问题?
解决方案
可能最容易编写一个使用堆栈来跟踪仍需要关闭的标签的小型解析器/处理器:
const s1 = 'the <H>quick</> brown fox.';
const s2 = 'the <U>quick</> brown fox.';
const s3 = '<H><U>The</> quick brown fox.';
const s4 = '<H><U>The</> quick </> brown fox.';
const process = (s) => {
const map = {'H': 'b', 'U': 'i'};
const stack = [];
return s.replace(/<([A-Z/])>/g, (_, t) => {
if (map[t]) {
stack.push(map[t]);
return `<${map[t]}>`;
} else {
return `</${stack.pop()}>`;
}
});
};
console.log(process(s1));
console.log(process(s2));
console.log(process(s3));
console.log(process(s4));
您的第三个示例仍然是无效的 HTML,因为开始和结束标签的数量不匹配。如果这不仅仅是您的示例中的错误,您将看到一个更复杂的解决方案,并且需要指定期望的行为应该是什么。
推荐阅读
- out-of-memory - Pytorch RuntimeError: CUDA error: out of memory at loss.backward() , 使用 CPU 时没有错误
- mysql - MySQL游标未在存储过程中退出
- javascript - Google Chart:如何使用侦听器设置初始选择以进行交互
- iis - 如何更改 IIS 上的默认日志目录 [W3SVC]
- algorithm - 从加权图中选择边,使得每个顶点都是一条边的端点,边权重之和最小
- c# - 将 Azure 索引搜索结果转换为 json 格式数据
- java - 从我手机的文件管理器中将 html 文件解析为字符串
- excel - 如何为 API 电报机器人的 sendPhoto 方法上传图像
- python - AttributeError:“设置”对象没有属性“场景”
- php - 值在浏览器中显示为空,但在数据库中可用