0

我的 JavaScript 中有一个 RegEx,它应该从 HTML 字符串(即,<p> </p><p>&nbsp;</p>)中删除空段落。它在 FF、Chrome、IE8 中运行良好,但在 IE9 中失败。在 IE9 中,第一段总是被删除。

var parsedData = '<p>this first paragraph is deleted in IE9</p>';
parsedData += '<p>can contain any number of paragraphs</p><p>&nbsp;</p>';
parsedData += '<p>&nbsp;</p><p>also contains some empty paragraphs</p><p></p>';

parsedData.replace(/(<p\s+.*>&nbsp;<\/p>|<p\s+.*>\s*<\/p>)*/gm, "");
4

4 回答 4

2

尽管不能使用正则表达式解析 HTML(因为 HTML 标记可以嵌套),但您可以使用正则表达式进行有限的字符串替换,包括您想要进行的替换类型。

在这个例子中,你的正则表达式太贪心了:<p\s*.*>匹配,除其他外<p>hello</p>,因为.*选择器过于笼统并且吞没了>hello</p。尝试替换.*[^>]*防止表达式匹配匹配开始的标记之外的任何内容。

于 2013-08-20T13:53:34.440 回答
1

迭代document.getElementsByTagName('p')(如果节点在 DOM 中不存在,则将它们添加到未附加到 DOM 的新节点,然后使用它)并检查它们的innerHTML.

于 2013-08-20T13:55:48.130 回答
1

我不确定您的正则表达式是否有效。当我尝试时,它无法替换萤火虫中的任何东西。这是一个可能的解决方案

parsedData.replace(/<p>(&nbsp;|\s*)<\/p>/gm, '')
于 2013-08-20T13:56:26.893 回答
0

只是为了澄清,我会自己回答这个问题。下面结合了 shyam 和 Imjohns3 的答案就可以了:

parsedData.replace(/<p\s+[^>]*>(&nbsp;|\s)*<\/p>/gm, "");
于 2013-08-21T09:06:10.633 回答