正则表达式排除某些标签

时间:2018-05-16 08:07:00

标签: javascript regex

我正在清理由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)

3 个答案:

答案 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);