正则表达式"<p><br/></p>"用空字符串替换字符串 - Javascript



我有一些HTML作为字符串

var str= "<p><br/></p>"

我如何使用JS从这个字符串中剥离p标签。以下是我到目前为止所做的尝试:

str.replace(/<p[^>]*>(?:s|&nbsp;)*</p>/, "") // o/p: <p><br></p>'
str.replace("/<p[^>]*><\/p[^>]*>/", "")// o/p: <p><br></p>'
str.replace(/<p><br></p>/g, "")// o/p: <p><br></p>'

它们都返回与上面相同的STR,期望的o/p是:str应该是""我哪里做错了?

感谢

您可能不应该使用RegExp来解析HTML-它对(X)HTML样式的标记不是特别有用,因为有太多的边缘情况。

相反,像解析DOM中的元素一样解析HTML,然后用空白字符串比较每个<p>trim()innerText值,并删除那些相等的:

var str = "<p><br/></p><p>This paragraph has text</p>"
var ele = document.createElement('body');
ele.innerHTML = str;
[...ele.querySelectorAll('p')].forEach(para => {
if (para.innerText.trim() === "") ele.removeChild(para);
});
console.log(ele.innerHTML);

您应该能够使用以下表达式:<p[^>]*>(&nbsp;|s+|<brs*/?>)*</p>

上面的表达式查看<p>...</p>中包含的表达式,并将它们与&nbsp;,空白(s+)和<br>(以及/变体)进行匹配。

我认为你大部分时间都在/<p[^>]*>(?:s|&nbsp;)*</p>/,但你只需要删除?:(不确定你在这里想做什么),并为<br>添加一个额外的案例。

const str = `
<p><br></p>
<p><br/></p>
<p><br /></p>
<p> <br/> </p>
<p> </p>
<p>&nbsp; </p>
<p><br/> &nbsp;</p>
<p>
<br>
</p><!-- multiline -->
<p><br/> don't replace me</p>
<p>don't replace me</p>
`;
const exp = /<p[^>]*>(&nbsp;|s+|<brs*/?>)*</p>/g;
console.log(str.replace(exp, ''));