JS正则表达式怎么匹配一段html串中指定的标签?

牛书书
  • 10k

比如

<div>
  123456
  <div>
  </div>
</div>
<div>
</div>

要怎么写一个正则才能匹配出上述的div标签?

let sText = "<div>  123456  <div>  </div></div><div></div>"
let reg = xxx // 这里要怎么写呢?
sText.match(reg)// 预期: ["<div>  123456  <div>  </div></div>", '<div></div>']

因为有嵌套的缘故,所以这里就不知道该怎么操作了,有没有熟悉的大哥来解惑一下?

回复
阅读 4.1k
3 个回答

前端js写的话可能比较费劲,貌似JavaScript不支持平衡组,如果支持平衡组的话就可以写,net下是支持平衡组的,嵌套的<div>标签:<div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>
意思就是当碰到<div>的时候将内容压入到堆栈中(分组是基于堆栈的形式保存),当碰到</div>的时候将堆栈的栈顶信息弹出,最后在判断如果堆栈的为空代表<div></div>封闭了,就输出内容。

伢伊
  • 1
新手上路,请多包涵

不知道你要做什么,可以试试用dom来处理.

let html = "<div>\n" +
    "  123456\n" +
    "  <div>\n" +
    "  </div>\n" +
    "</div>\n" +
    "<div>\n" +
    "</div>";
let div = document.createElement("div");
div.innerHTML = html;

if (div.children.length !== 0) {
    for (let i = 0; i < div.children.length; i++) {
        let child = div.children[0];
        if (child.tagName.toLowerCase() === "div") {
            console.log(i,div.children[i]);
        }
    }
}

最后手动维护栈解决了,没有用正则来解决.

宣传栏