Javascript регулярное выражение заменить многострочный контент между двумя тегами (включая теги) - PullRequest
1 голос
/ 17 августа 2011

В строке

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 голосов
/ 17 августа 2011

Мне нужно принять несколько невысказанных ограничений из вашего вопроса, чтобы это сработало:

Правильно ли я догадываюсь, что вы хотите регулярное выражение, которое может найти (а затем заменить) любое 'p 'тег с определенным идентификатором, вплоть до определенного тега (например, тег' br ') с идентификатором' end_of_ [firstid] '?

Если это правильно, то может сработать следующее регулярное выражениедля тебя.Возможно, вам нужно немного изменить его, чтобы JS принял его:

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

Это даст вам любое созвездие с критериями, описанными выше, и имя, если идентификатор в качестве группы1. Теперь это должно быть простой задачей: проверить, содержит ли group1 идентификатор, который вы хотите удалить, и затем заменить все совпадение пустой строкой.

Если я правильно понимаю ваш пример (я не так хорошс JavaScript и мой RegEx был основан скорее на общем стиле Perl-регулярных выражений) вы можете сделать что-то вроде следующего:

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

Таким образом, вам не нужно беспокоиться о сопоставлении групп, хотя янайдите его более элегантным, чтобы он соответствовал нужному идентификатору через группу, а не вставлял его в RegEx.

0 голосов
/ 17 августа 2011

Вот регулярное выражение для текущего сценария.Когда подход к регулярным выражениям в конечном итоге нарушается, помните, что мы предупреждали, что разбор 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>"
0 голосов
/ 17 августа 2011

Почему вы не можете использовать DOM API для его удаления?(добавьте все в документ, а затем удалите то, что вам не нужно)

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

item1.parentNode.removeChild(item1);
endOfItem1.parentNode.removeChild(endOfItem1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...