Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式删除不匹配的结束HTML标记?_Javascript_Html_Regex_Parsing_Element - Fatal编程技术网

Javascript正则表达式删除不匹配的结束HTML标记?

Javascript正则表达式删除不匹配的结束HTML标记?,javascript,html,regex,parsing,element,Javascript,Html,Regex,Parsing,Element,我正试图删除javascript中过多的结束标记以及之后的任何内容 以下是一个可能的示例: <div class="dummy"> <div class="main"> <div></div> <img src="a.jpg"> <br> <img src="b.jpg /> <strong>

我正试图删除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开头。 所以,我所需要的就是找到匹配的结束标记,并过滤后面的任何内容。
不关心任何其他标记…

不要使用regex,根据我的理解,您希望保留伪类div和footer类div,那么为什么不用它替换主体呢

例如


不要使用正则表达式,根据我的理解,您希望保留伪类div和footer类div,那么为什么不用它替换主体呢

例如

data='
text***文本下方的标签过多; var起始标签=[]; var关闭标签=[]; var startIndex,指数=0; var-searchStrLen=4; 而((index=data.indexOf('
data='
text***文本下方的标记过多); var起始标签=[]; var关闭标签=[]; var startIndex,指数=0; var-searchStrLen=4;

而((index=data.indexOf)('这里有一个很好的答案:Regex不是一个解析工具。确切地说,你想要删除的标记是什么?注释下面多余标记下面的所有内容?保持页脚div的两个不匹配的标记?一个更好的问题的可能重复是:有人知道HTML解析器会在末尾丢弃不必要的标记吗?下面是一个t错误答案:Regex不是一个解析工具。你想要删除的标记到底是什么?注释下面多余标记下面的所有内容?保持页脚div的两个不匹配的标记?一个更好的问题可能是:有人知道HTML解析器会在最后丢弃不必要的标记吗?这些不是物理的元素。它们在DOM中不存在,我只是在解析一个字符串。不,我实际上不需要页脚。只有伪div。你能创建一个html元素,将其内容设置为字符串,然后运行JS吗?回答得好!好狗!基本上是处理类似问题的最干净的方法。不,你是在创建DOM元素ts,您甚至不会使用它。这将显著影响您的性能。如果我不关心性能,我也可以渲染整个页面,然后在其上运行jquery选择器。这是我第一次尝试的方式。它实际上是一个单行程序,但对于机器人来说,它的性能是不可接受的,因此我有不同的答案。主流浏览器,甚至是移动浏览器浏览器与DOM的交互效率非常高,也可以在0毫秒内处理此任务。这些不是物理元素。它们在DOM中不存在,我只是在解析字符串。不,我实际上不需要页脚。只有虚拟div。您可以创建一个html元素,将其内容设置为字符串,然后针对该字符串运行JS吗?Great answer!好狗!基本上是处理此类问题的最干净的方法。不,您正在创建DOM元素,您甚至不会使用。这将显著影响您的性能。如果我不关心性能,我还可以渲染整个页面,然后在其上运行jquery选择器。这是我第一次尝试的方法。这是实际的虽然只有一行代码,但对于机器人来说,它的性能是不可接受的,所以我有不同的答案。主流浏览器,甚至是移动浏览器,与DOM的交互效率非常高,并且可以在0毫秒内完成这项任务。看起来只需操作DOM就有很多开销,但没有任何收益。哦,相信我,这是一个巨大的收益。此脚本运行时间为0毫秒,秒o我非常高兴。看起来只是操纵DOM会带来很多开销,但没有任何好处。哦,相信我,这是一个巨大的好处。这个脚本运行时间为0毫秒,所以我非常高兴。
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);
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);