使用JavaScript正则表达式flavor,如何仅在内部另一个特定标记内匹配特定标记?

时间:2016-06-13 04:41:50

标签: javascript regex

我想仅匹配<br>标记内的<main>标记,而不是所有标记:

enter image description here

是否有可能使用JS正则表达式?我正在尝试在项目的所有文件中进行查找和替换(使用正则表达式)。

这是原始文本:

<br>
<main>
    <input>
    <br>
    <hr>
    <br>
    <etc>
</main>

3 个答案:

答案 0 :(得分:2)

使用DOM总是更好地解析HTML文本。但是,如果有理由您无法使用DOM这是一个正则表达式解决方案,以匹配<br><main>之间的所有</main>标记。

/<\s*br\s*\/?>(?=.*?(?:(?!<main>)[\s\S])*?<\/main>)/gi

RegEx分手:

<\s*br\s*\/?>   # matches <br> or <br />
(?=             # start of lookahead
  .*?           # any arbitrary text, lazy
  (?:           # start of non-capturing group
     (?!        # start of negative lookahead
       <main>   # literal text <main>
     )          # end of negative lookahead   
     [\s\S]*?   # match 0 or more of any char including newline, lazy
  )             # end of non-capturing group
  <\/main>      # match </main>
)               # end of lookahead
/gi             # make it global ignore case match

RegEx Demo

答案 1 :(得分:0)

创建了使用

仅使用MAIN捕获BR元素的codepen URL
 document.body.childNodes

codepen - http://codepen.io/nagasai/pen/MeybzK

首先得到Body的所有childNodes然后MAIN并从那个

过滤BR标签

希望这对你有所帮助

        function allTags() {
        var c = document.body.childNodes;
        //console.log(c);
        var txt = "";
        var i;
        for (i = 0; i < c.length; i++) {
            if (c[i].nodeName == "MAIN") {
                // alert(c[i].childNodes.length )
                for (j = 0; j < c[i].childNodes.length; j++) {
                    //alert(c[i].childNodes[j].nodeName);
                    if (c[i].childNodes[j].nodeName == "BR") {
                        txt = txt + c[i].childNodes[j];
                    }
                }

            }

        }
        console.log(txt);

        document.getElementById("demo").innerHTML = txt;
    }

HTML:

          <p>11</p><br>
      <main>
          <br>
          <div>q1111</div><br>
      </main>

      <button onclick="allTags()">Tags</button>
      <div id="demo"></div>

答案 2 :(得分:0)

正如其他人所评论的那样,我总是说,不要使用正则表达式来解析HTML。是的,您可以使用DOM来替换元素。它不会像正则表达式那样紧凑(并且不可读),但我认为这仍然很短:

for(let br of document.querySelector('main br'))
  br.parentNode.replaceChild(br, document.createElement('span'))

(假设您想要将<br>替换为另一个元素。删除或替换文本也同样容易。)