我有一些HTML作为字符串
var str= "<p><br/></p>"
我如何使用JS从这个字符串中剥离p标签。以下是我到目前为止所做的尝试:
str.replace(/<p[^>]*>(?:s| )*</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[^>]*>( |s+|<brs*/?>)*</p>
上面的表达式查看<p>...</p>
中包含的表达式,并将它们与
,空白(s+
)和<br>
(以及/
变体)进行匹配。
我认为你大部分时间都在/<p[^>]*>(?:s| )*</p>/
,但你只需要删除?:
(不确定你在这里想做什么),并为<br>
添加一个额外的案例。
const str = `
<p><br></p>
<p><br/></p>
<p><br /></p>
<p> <br/> </p>
<p> </p>
<p> </p>
<p><br/> </p>
<p>
<br>
</p><!-- multiline -->
<p><br/> don't replace me</p>
<p>don't replace me</p>
`;
const exp = /<p[^>]*>( |s+|<brs*/?>)*</p>/g;
console.log(str.replace(exp, ''));