如何使用正则表达式 select 清空 HTML 可能有多个空嵌套标签的标签?
How to select empty HTML tags that may have multiple empty nested tags using regex?
我想 select 所有独立的空标签都是嵌套的,而不是其他标签。例如,正则表达式应匹配:
<p></p>
<p><strong><em></em></strong></p>
<p style="background: black;"><span></span></p>
但不是这个:
<p>text</p>
<p><strong><em>text</em></strong></p>
<p style="background: black;"><span>text</span></p>
在像 <p><span style="background-color: red;"></span>some text </p>
这样棘手的情况下,它应该匹配 <span style="background-color: red;"></span>
。
这是我目前正在使用的:<[^<p>\/>][^>]*><\/[^>]+>
但是,它排除了 <p><strong><em></em></strong></p>
等情况,其中有多个嵌套标签。
谢谢!
此版本应该可以找到空段落和段落内的空嵌套标签。它适用于 3 个嵌套标签的级别。
function emptyNestedTags(str)
{
var match = str.match(/<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?><\/>)?<\/>)?<\/>/);
if (match) return match[0]; else return "no empty tags found";
}
alert(emptyNestedTags("<p id=\"id\"></p>"));
alert(emptyNestedTags("<p id=\"id\">SOME TEXT</p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em></p>"));
alert(emptyNestedTags("<p><em id=\"id\">SOME TEXT</em></p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em>SOME TEXT </p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em>TEXT</em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span> TEXT</p>"));
如果您不想检查结束标签是否与开始标签匹配(您为什么要这样做,真的吗?)它更简单,不需要捕获组:
function emptyNestedTags(str)
{
return str.match(/<\w+(?:\s[^>]*)?>(?:<\w+(?:\s[^>]*)?>(?:<\w+(?:\s[^>]*)?><\/\w+>)?<\/\w+>)?<\/\w+>/);
}
alert(emptyNestedTags("<p id=\"id\"></p>"));
alert(emptyNestedTags("<p id=\"id\">SOME TEXT</p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em></p>"));
alert(emptyNestedTags("<p><em id=\"id\">SOME TEXT</em></p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em>SOME TEXT </p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em>TEXT</em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span> TEXT</p>"));
我想 select 所有独立的空标签都是嵌套的,而不是其他标签。例如,正则表达式应匹配:
<p></p>
<p><strong><em></em></strong></p>
<p style="background: black;"><span></span></p>
但不是这个:
<p>text</p>
<p><strong><em>text</em></strong></p>
<p style="background: black;"><span>text</span></p>
在像 <p><span style="background-color: red;"></span>some text </p>
这样棘手的情况下,它应该匹配 <span style="background-color: red;"></span>
。
这是我目前正在使用的:<[^<p>\/>][^>]*><\/[^>]+>
但是,它排除了 <p><strong><em></em></strong></p>
等情况,其中有多个嵌套标签。
谢谢!
此版本应该可以找到空段落和段落内的空嵌套标签。它适用于 3 个嵌套标签的级别。
function emptyNestedTags(str)
{
var match = str.match(/<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?><\/>)?<\/>)?<\/>/);
if (match) return match[0]; else return "no empty tags found";
}
alert(emptyNestedTags("<p id=\"id\"></p>"));
alert(emptyNestedTags("<p id=\"id\">SOME TEXT</p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em></p>"));
alert(emptyNestedTags("<p><em id=\"id\">SOME TEXT</em></p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em>SOME TEXT </p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em>TEXT</em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span> TEXT</p>"));
如果您不想检查结束标签是否与开始标签匹配(您为什么要这样做,真的吗?)它更简单,不需要捕获组:
function emptyNestedTags(str)
{
return str.match(/<\w+(?:\s[^>]*)?>(?:<\w+(?:\s[^>]*)?>(?:<\w+(?:\s[^>]*)?><\/\w+>)?<\/\w+>)?<\/\w+>/);
}
alert(emptyNestedTags("<p id=\"id\"></p>"));
alert(emptyNestedTags("<p id=\"id\">SOME TEXT</p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em></p>"));
alert(emptyNestedTags("<p><em id=\"id\">SOME TEXT</em></p>"));
alert(emptyNestedTags("<p><em id=\"id\"></em>SOME TEXT </p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em>TEXT</em></span></p>"));
alert(emptyNestedTags("<p><span style=\"background-color: red;\"><em></em></span> TEXT</p>"));