我想仅匹配<br>
标记内的<main>
标记,而不是所有标记:
是否有可能使用JS正则表达式?我正在尝试在项目的所有文件中进行查找和替换(使用正则表达式)。
这是原始文本:
<br>
<main>
<input>
<br>
<hr>
<br>
<etc>
</main>
答案 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
答案 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>
替换为另一个元素。删除或替换文本也同样容易。)