我正在清理由wysiwyg创建的输出,而不是插入一个中断,它只是创建一个空的p标记,但它有时会创建其他不需要的空标记。
我有一个正则表达式删除所有空标记,但我想从中排除空p标记。我该怎么做?
let s = "<h1>test</h1><h1></h1><p>a</p><p></p><h2></h2>";
s = s.trim().replace( /<(\w*)\s*[^\/>]*>\s*<\/\1>/g, '' )
console.log(s)
答案 0 :(得分:1)
将(?!p)
添加到正则表达式中。这称为Negative Lookahead
:
let s = "<h1>test</h1><h1></h1><p>a</p><p></p><h2></h2>";
s = s.trim().replace( /<(?!p)(\w*)\s*[^\/>]*>\s*<\/\1>/g, '' )
console.log(s)
答案 1 :(得分:1)
我知道你想使用正则表达式,但有更好的方法。考虑使用var x = "<h1>test</h1><h1></h1><p>a</p><p></p><h2></h2>"
var parse = new DOMParser;
var doc = parse.parseFromString(x,"text/html");
Array.from(doc.body.querySelectorAll("*"))
.filter((d)=>!d.hasChildNodes() && d.tagName.toUpperCase() !== "P")
.forEach((d)=>d.parentNode.removeChild(d));
console.log(doc.body.innerHTML);
//"<h1>test</h1><p>a</p><p></p>"
:
{{1}}
您可以将上述内容包装在一个函数中并根据需要进行修改。
答案 2 :(得分:1)
您可以使用DOMParser
安全起见。
let s = "<h1>test</h1><h1></h1><p>a</p><p></p><h2></h2>";
const parser = new DOMParser();
const doc = parser.parseFromString(s, 'text/html');
const elems = doc.body.querySelectorAll('*');
[...elems].forEach(el => {
if (el.textContent === '' && el.tagName !== 'P') {
el.remove();
}
});
console.log(doc.body.innerHTML);