繁体   English   中英

Javascript 正则表达式替换两个标签之间的多行内容(包括标签)

[英]Javascript regexp replace of multiline content between two tags (including the tags)

在字符串中

some text <p id='item_1' class='item'>multiline content\r\n\r\n for <br/>remove</p><br clear='all' id='end_of_item_1'/><p id='item_2' class='item'>another multiline content\r\n\r\n</p><br clear='all' id='end_of_item_2'/>

我需要删除

<p id='item_1' class='item'>multiline content\r\n\r\n for <br/>remove</p><br clear='all' id='end_of_item_1'/>

找不到方法如何做到这一点。

var id = 'item_1';
var patt=new RegExp("<p id='"+id+"'(.)*|([\S\s]*?)end_of_"+id+"'\/>","g");
var str="some text <p id='item_1' class='item'>multiline content\r\n\r\n for <br/>remove</p><br clear='all' id='end_of_item_1'/><p id='item_2' class='item'>another multiline content\r\n\r\n</p><br clear='all' id='end_of_item_2'/>";
document.write(str.replace(patt,""));

结果是

some text for
<br>
remove
<p></p>
<br id="<p id=" class="item" clear="all" item_2'="">
another multiline content
<p></p>
<br id="end_of_item_2" clear="all">

请帮助解决这个问题。

为什么不能使用 DOM API 来删除它? (将所有内容添加到文档中,然后删除不需要的内容)

var item1 = document.getElementById('item_1'),
    endOfItem1 = document.getElementById('end_of_item_1');

item1.parentNode.removeChild(item1);
endOfItem1.parentNode.removeChild(endOfItem1);

我需要从你的问题中假设一些不言而喻的限制,才能让它发挥作用:

我猜对了吗,你想要一个正则表达式,它可以找到(然后替换)任何具有特定 id 的“p”标签,直到某个标签(如“br”标签),id 为“end_of_” [第一个]'?

如果这是正确的,那么以下正则表达式可能对您有用。 可能需要稍微修改一下,让 JS 接受它:

<p\s+id='([a-zA-Z0-9_]+)'.*?id='end_of_\1'\s*\/>

这将为您提供具有上述标准的任何星座,以及如果 id 为组 1 的名称,现在应该是一项简单的任务,检查 group1 是否包含您要删除的 id,然后将整个匹配替换为空字符串。

如果我理解您的示例正确性(我对 JavaScript 不太擅长,而且我的 RegEx 是基于一般的 perl-regex 时尚),您可能会执行以下操作:

var patt=new RegExp("<p\s+id='"+id+"'.*?id='end_of_"+id+"'\s*\/>","g");

这样,您不必担心组匹配,尽管我发现它更优雅,通过组匹配您想要的 id 而不是将其插入到 RegEx 中。

这是当前场景的正则表达式。 当正则表达式方法最终失效时,请记住我们警告过使用正则表达式解析 HTML 是愚蠢的差事。 ;)

这个:

var s        = "some text <p id='item_1' class='item'>multiline content\r\n\r\n for <br/>remove</p><br clear='all' id='end_of_item_1'/><p id='item_2' class='item'>another multiline content\r\n\r\n</p><br clear='all' id='end_of_item_2'/><ul><li>";
var id       = 'item_1';

var patt     = new RegExp ("<p[^<>]*\\sid=['\"]" + id + "['\"](?:.|\\n|\\r)*<br[^<>]*\\sid=['\"]end_of_" + id + "['\"][^<>]*>", "ig")

var stripped = s.replace (patt, "");

产生这个:

"some text <p id='item_2' class='item'>another multiline content 

</p><br clear='all' id='end_of_item_2'/><ul><li>"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM