Javascript regexp替换两个标签之间的多行内容(包括标签)

时间:2011-08-17 09:44:17

标签: javascript regex replace

在字符串

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">

请帮助解决这个问题。

3 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我需要从你的问题中假设一些不言而喻的限制,以使其发挥作用:

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

如果这是正确的,那么以下正则表达式可能适合您。可能是,你需要稍微修改一下,让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。

答案 2 :(得分:0)

这是当前场景的正则表达式。当正则表达式方法最终破解时,请记住我们警告用正则表达式解析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>"