如何使用正则表达式选择可能有多个空嵌套标签的空HTML标签?

时间:2015-07-22 23:25:36

标签: php html regex tags regex-negation

我想选择所有独立的空标签嵌套而不是其他标签。例如,正则表达式应匹配:

<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 &nbsp;</p>这样棘手的情况下,它应匹配<span style="background-color: red;"></span>

这就是我目前使用的内容:<[^<p>\/>][^>]*><\/[^>]+>但是,它遗漏了<p><strong><em></em></strong></p>等案例,其中有多个嵌套代码。

谢谢!

1 个答案:

答案 0 :(得分:1)

此版本应在段落中找到空段落和空嵌套标记。它的工作级别为3个嵌套标签。

&#13;
&#13;
function emptyNestedTags(str)
{
      var match = str.match(/<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?>(?:<(\w+)(?:\s[^>]*)?><\/\3>)?<\/\2>)?<\/\1>/);
      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>"));
&#13;
&#13;
&#13;

如果您不想检查结束标记是否与开始标记匹配(为什么,您真的?)它更简单,无需捕获组:

&#13;
&#13;
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>"));
&#13;
&#13;
&#13;