RegEx 否定前瞻只匹配一个字符
RegEx negative lookahead matches only one character
我写了一个正则表达式,它应该匹配除 <span style="background-color: #any-color">
和 </span>
之外的所有危险 HTML 字符:
((?!<span style="background-color: #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)[&<>"'/])
但是,它匹配我排除的额外字符。
这里的 RegEx 不应该匹配引号 style="background-color:
,但是它匹配:
我哪里弄错了?
见Regex101 demo. Here is the link to the current project:
function escapeHtml(in_) {
return in_.replace(/((?!<span style="background-color: #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)[&<>"'/])/g, s => {
const entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': ''',
'/': '/',
};
return entityMap[s];
});
}
请注意,只有当您完全控制出现在纯文本字符串中的实体时,您才可以使用正则表达式。
因此,如果您手动添加 </span>
和 <span style="background-color: #aaff11">
之类的字符串,您可以像这样修复您的代码:
function escapeHtml(in_) {
return in_.replace(/(<span style="background-color: #(?:[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)|[&<>"'\/]/g, ([=10=],) => {
const entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': ''',
'/': '/',
};
return ? : entityMap[[=10=]];
});
}
console.log(escapeHtml('<b>some test <span style="background-color: #333300">ol string!</b></span> nope <i>whoops</i> <span style="background-color: #ff0000">meh</span>'));
否则,您需要考虑 DOM 解析方法。参见 Parse an HTML string with JS。
我写了一个正则表达式,它应该匹配除 <span style="background-color: #any-color">
和 </span>
之外的所有危险 HTML 字符:
((?!<span style="background-color: #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)[&<>"'/])
但是,它匹配我排除的额外字符。
这里的 RegEx 不应该匹配引号 style="background-color:
,但是它匹配:
我哪里弄错了?
见Regex101 demo. Here is the link to the current project:
function escapeHtml(in_) {
return in_.replace(/((?!<span style="background-color: #([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)[&<>"'/])/g, s => {
const entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': ''',
'/': '/',
};
return entityMap[s];
});
}
请注意,只有当您完全控制出现在纯文本字符串中的实体时,您才可以使用正则表达式。
因此,如果您手动添加 </span>
和 <span style="background-color: #aaff11">
之类的字符串,您可以像这样修复您的代码:
function escapeHtml(in_) {
return in_.replace(/(<span style="background-color: #(?:[A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})">|<\/span>)|[&<>"'\/]/g, ([=10=],) => {
const entityMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
'\'': ''',
'/': '/',
};
return ? : entityMap[[=10=]];
});
}
console.log(escapeHtml('<b>some test <span style="background-color: #333300">ol string!</b></span> nope <i>whoops</i> <span style="background-color: #ff0000">meh</span>'));
否则,您需要考虑 DOM 解析方法。参见 Parse an HTML string with JS。