【问题标题】:Javascript regex to remove unmatched closing HTML tags?Javascript 正则表达式删除不匹配的关闭 HTML 标记?
【发布时间】:2017-03-10 04:01:58
【问题描述】:

我正在尝试删除 javascript 中过多的结束标记以及之后的任何内容。

这是一个可能的示例:

<div class="dummy">
    <div class="main">
        <div></div>
        <img src="a.jpg">
        <br>
        <img src="b.jpg />
        <strong>
            <span>text</span>
        </strong>
    </div>
</div>
    ***excessive tags below***
</div>
</div>
<div class="footer">
    text
</div>
</body>
</html>

关于如何有效地做到这一点的任何想法? 我要提取的部分总是一个 div,但问题是它可能有很多嵌套的 div,我不知道如何处理这种情况。

如果它可以通过多个步骤完成或使用回调也可以,只要它有效。

编辑 我的问题实际上比看起来容易。 该示例始终以我要提取的 div 开头。 所以我只需要找到匹配的结束标签,然后过滤后面的任何内容。 别管其他标签...

【问题讨论】:

标签: javascript html regex parsing element


【解决方案1】:

不要使用正则表达式,据我了解,您想保留虚拟类 div 和页脚类 div 那么为什么不用它替换正文?

例如

var dummy = document.getElementsByClassName('dummy')[0];
var footer = document.getElementsByClassName('footer')[0]

var body = document.getElementsByTagName('body')[0];
body.innerHTML = '';
body.appendChild(dummy);
body.appendChild(footer);

https://jsfiddle.net/1kq11ry2/

【讨论】:

  • 那些不是物理元素。它们在 DOM 中不存在,我只是在解析一个字符串。不,我实际上不需要页脚。只有虚拟 div。
  • 你能不能创建一个 html 元素,将它的内容设置为字符串,然后运行 ​​JS?
  • 很好的答案!好总督!基本上是处理此类问题的最干净的方法。
  • 不,你正在创建你甚至不会使用的 DOM 元素。这将极大地影响您的表现。如果我不关心性能,我也可以渲染整个页面,然后在其上运行 jquery 选择器。这就是我第一次尝试的方式。它实际上是一个单线,但对于机器人来说它的性能不合格,所以我有不同的答案。
  • 领先的浏览器,甚至是移动浏览器,与 DOM 交互的效率令人难以置信,并且还可以在 0 毫秒内处理此任务。
【解决方案2】:
data='<div class="dummy"><div class="main"><div></div><img src="a.jpg"><br><div></div><img src="b.jpg /><strong><span>text</span> </strong></div><div><div></div></div><div><div></div></div></div>***excessive tags below***</div></div><div class="footer">text</div></body></html>';



var starting_tags = [];
var closing_tags = [];

        var startIndex, index=0;
    var searchStrLen = 4;
    while ((index = data.indexOf('<div', startIndex)) > -1) {
        starting_tags.push(index);
        startIndex = index + searchStrLen;
    }
    index,startIndex=0;
    searchStrLen = 6;
     while ((index = data.indexOf('</div>', startIndex)) > -1) {
        closing_tags.push(index);
        startIndex = index + searchStrLen;
    }

    var nest_level=0;
    for (var i=0; i<closing_tags.length && nest_level<closing_tags.length && nest_level<=closing_tags.length; ++i) {
      for (var j=0+nest_level; j<starting_tags.length; ++j) {
                if (starting_tags[j]<closing_tags[nest_level]) 
            nest_level++;
      }
    }
result = data.substr(startIndex[starting_tags], closing_tags[nest_level-1]+6);    

console.log(nest_level);
console.log(starting_tags);
console.log(closing_tags);
console.log(result);

我能够解决它。上面的代码计算了 div 嵌套的级别,如果发现过多的结束标签,则将其砍掉。

https://jsfiddle.net/89j7yakz/2/

【讨论】:

  • 看起来比仅仅操作 DOM 的开销很大。
  • 哦,相信我有一个巨大的收获。这个脚本在 0 毫秒内运行,所以我很高兴。
猜你喜欢
  • 2011-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-11
  • 2012-04-02
  • 1970-01-01
  • 2014-08-29
相关资源
最近更新 更多