Исправление в регулярном выражении

У меня есть контент, который содержит контент вместе с тегами HTML внутри контента. Я пытаюсь определить<ins></ins> а также<del></del> с условиями, указанными на изображении

http://i.stack.imgur.com/8iNWl.png

Регулярное выражениеhttps://regex101.com/r/cE4mE3/30

Это дает сбой только в одном случае, то есть когда есть HTML-тег или специальный символ внутри<ins></ins> его не правильно идентифицируя. В приведенном выше регулярном выражении есть</ins></ins> внутри другого<ins></ins> и, следовательно, он ломается до начала открытия<ins> тег. Идентификация регулярного выражения должна останавливаться только тогда, когда между точкой или пробелом стоит пробел<ins></ins>, Но если есть какой-либо тег HTML или другой<ins></ins> пометить себя внутри другого<ins></ins> идентификация должна продолжаться.

В приведенном выше регулярном выражении группы, которые должны быть выбраны

 1. <ins class="ins">ff</ins><del class="del">C</del>om<del class="del"> </del><ins class="ins"><ins class="ins">g</ins></ins><del class="del"> g</del>gp<del class="del">a</del>n<del class="del">y</del>

а также

 2. test<del class="del">test</del><ins class="ins">tik</ins><del class="del">peop</del>man<del class="del"> </del></i><del class="del"> g</del>gp<del class="del">a</del>n<del class="del">y</del>

Но так как есть HTML-теги, идентификация останавливается возле HTML-тега в 1 и 2 группах.

 Rajitha10 авг. 2016 г., 12:23
если для этого нет решения, могу ли я получить регулярное выражение для идентификации только <ins> </ ins>, в котором есть еще один <ins> </ ins>. Например, «<ins> word word <ins> word </ ins> </ ins>»
 Nick Bull10 авг. 2016 г., 12:04
«упростить объяснение»ответил с бесконечными тегами HTML
 sln10 авг. 2016 г., 11:59
Можете ли вы упростить объяснение того, что вы пытаетесь сопоставить или заменить?
 Sebastian Proske10 авг. 2016 г., 11:48
Разве я не видел этот вопрос, неоднократно отправленный с разными аккаунтами?
 Rajitha10 авг. 2016 г., 11:54
Содержание может быть таким же, потому что все, что он содержит, это теги <ins> и <del>, но вопрос в другом
 Rajitha10 авг. 2016 г., 12:12
извините, это не "из" его "или" в "Если есть HTML-тег или <ins> или </ ins> между наборами <ins> </ ins>, совпадение должно продолжаться по этим"
 sln10 авг. 2016 г., 12:11
If there is HTML tag of another <ins> or </ins> in between set of <ins></ins> the match must continue over these Это убивает регулярное выражение для вас. JavaScript не может выполнить рекурсию в движке регулярных выражений ECmaScript. PHP может хотя. Извините, нет решения для вас ..
 sln10 авг. 2016 г., 12:04
У вас много квалификаций с содержанием. Можете ли вы объяснить парадигму открытия / закрытиятеги, Это на самом деле важнее, чем контент ...
 Jeffrey0410 авг. 2016 г., 12:25
пожалуйста, не используйте regex для html, если у вас есть jquery, используйте это вместо
 Nick Bull10 авг. 2016 г., 12:05
Если бы мне было 5 лет, как бы вы это объяснили? Вы хотите соответствовать всем<del> а также<ins> теги? Тогда что вы хотите сделать, получить их содержание? Удалить его, если он между<del> и что-то еще между<ins> (предполагая какую-то вставку)?
 Rajitha10 авг. 2016 г., 12:03
@sln Я пытаюсь найти соответствие <ins class = "ins"> ff </ ins> <del class = "del"> C </ del> om <del class = "del"> </ del> <ins class = "ins"> <ins class = "ins"> g </ ins> </ ins> <del class = "del"> g </ del> gp <del class = "del"> a </ del> n < del class = "del"> y </ del> но в этой части это <ins> </ ins> внутри другого <ins> </ ins>, следовательно, совпадение остановилось возле <ins class = "ins"> ff </ ins> <del class = "del"> C </ del> om <del class = "del"> </ del>
 Rajitha10 авг. 2016 г., 12:05
другое совпадение должно быть test <del class = "del"> test </ del> <ins class = "ins"> tik </ ins> <del class = "del"> peop </ del> man <del class = "del"> </ del> </ i> <del class = "del"> g </ del> gp <del class = "del"> a </ del> n <del class = "del"> y < / del> но теперь это test <del class = "del"> test </ del> <ins class = "ins"> tik </ ins> <del class = "del"> peop </ del> man <del class = "del"> </ del>, потому что есть тег HTML, т. е. тег <i> между ними, поэтому совпадение остановлено возле тега <i>
 Rajitha10 авг. 2016 г., 12:08
@NickBull не все, исходя из условий, которые я объяснил на диаграммеi.stack.imgur.com/8iNWl.png, Единственное изменение, которое должно быть сделано в текущем регулярном выраженииregex101.com/r/cE4mE3/30 если между тегом <ins> </ ins> есть пробел, запятая или точка полного останова, то только совпадение должно быть остановлено. Если между набором <ins> </ ins> есть HTML-тег или другой тег <ins> или </ ins>, сопоставление должно продолжаться в течение этих
 sln10 авг. 2016 г., 12:14
Это ключевая фраза ->another <ins> or </ins> in between set of <ins></ins> и до сих пор нет рекурсии в JS. Без рекурсии нет способапара набор открывающих / закрывающих тегов. Когда я сказалрекурсия Я говорю о СТЕКЕ!

Ответы на вопрос(1)

Это на самом деле слишком много для регулярного выражения - если вы хотите что-то изменить в будущем, это будет серьезно недопустимо и трудно исправить. Используя jQuery, вот лучший способ:

var resultsArray = [];

// 1   Loop over all parent > del or parent > ins nodes.
$("p > del,p > ins").each(function(index, element) {
  $(this).map(function(){
    // 1    Check that they have a word or a space before the node.
    if (this.previousSibling &&
        this.previousSibling.nodeValue &&
        /(\w| )/.test(this.previousSibling.nodeValue)) {
      var textBeforeTag = this.previousSibling.nodeValue;
      // 1 Stage complete
      console.log("1: Word or space found before <del/ins> tag - value '" + textBeforeTag + "'");
      
      // 2a   Check that the node has "del" tags within it
      $(element).children("del").each(function(i, e) {
        // 2a    Stage 2a complete
        console.log("2a: <del> child tag found.");
 
        // SUCCESS: <ins>/<del> tag starting with word or space contained a <del> tag with any content - add to results
        resultsArray.push(e);
      });

      // 2b   Check that the node has "ins" tags within it
      $(element).children("ins").each(function(i, e) {
        // 2b   Check child value is only one word
        console.log("2b: <ins> child tag found - checking it's inner value ('"+e.innerHTML+"') is only one word without space.");
        if (/^\w$/.test(e.innerHTML)) {
          console.log("2b: Child passed one word test - adding to results.");
          // SUCCESS: <ins>/<del> tag starting with word or space contained a <ins> tag with one word content - add to results
          resultsArray.push(e);
        }
        else console.log("2b: Child failed one word test.");
      });

      // 2c   Check that the node has text of a single word within it
      if (/^\w$/.test(element.innerHTML)) {
        console.log("2c: Parent passed one word test - adding to results."); 
        // SUCCESS: <ins>/<del> tag starting with word or space contained text with any content - add to results
        resultsArray.push(element);
      }
    }
  });
});

// Iterate results and add to <div id="test>
resultsArray.forEach(function(e) {
  $("#test").append("Match:");
  $("#test").append("<p>"+e.innerHTML+"</p>");
  $("#test").append("<br/>");
});
#test { margin-bottom: 100px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>The <ins class="ins">ff</ins><del class="del">C</del>om<del class="del"> </del> <ins class="ins">Value<ins class="ins">g</ins></ins><del class="del"> g</del>gp<del class="del">a</del>n<del class="del">y</del> has provided to you all relevant information and access
  as agreed in the terms of the <span style="background-color: rgb(251, 236, 201);" auditor-judgement-id="xzujy8vqwsni">audit engagement letter.enter the text is</span><i>test<del class="del">test</del><ins class="ins">tik</ins><del class="del">peop</del>man<del class="del"> </del></i>
  <del
  class="del">g</del>gp<del class="del">a</del>n<del class="del">y</del>
</p>
<div id="test"></div>

var resultsArray = [];

$("p > del,p > ins").each(function(index, element) {
  $(this).map(function(){
    if (this.previousSibling &&
        this.previousSibling.nodeValue &&
        /(\w| )/.test(this.previousSibling.nodeValue)) {
      var textBeforeTag = this.previousSibling.nodeValue;
      
      $(element).children("del").each(function(i, e) {
        resultsArray.push(e);
      });

      $(element).children("ins").each(function(i, e) {
        if (/^\w$/.test(e.innerHTML)) {
          resultsArray.push(e);
        }
      });

      if (/^\w$/.test(element.innerHTML)) {
        resultsArray.push(element);
      }
    }
  });
});

// Iterate results and add to <div id="test>
resultsArray.forEach(function(e) {
  $("#test").append("Match:");
  $("#test").append("<p>"+e.innerHTML+"</p>");
  $("#test").append("<br/>");
});
#test { margin-bottom: 100px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p>The <ins class="ins">ff</ins><del class="del">C</del>om<del class="del"> </del> <ins class="ins">Value<ins class="ins">g</ins></ins><del class="del"> g</del>gp<del class="del">a</del>n<del class="del">y</del> has provided to you all relevant information and access
  as agreed in the terms of the <span style="background-color: rgb(251, 236, 201);" auditor-judgement-id="xzujy8vqwsni">audit engagement letter.enter the text is</span><i>test<del class="del">test</del><ins class="ins">tik</ins><del class="del">peop</del>man<del class="del"> </del></i>
  <del
  class="del">g</del>gp<del class="del">a</del>n<del class="del">y</del>
</p>
<div id="test"></div>

 Nick Bull10 авг. 2016 г., 13:45
@ Раджита, я не совсем понимаю. Запустите второй фрагмент - это выводит то, что вы хотите? Вы просто хотите текст между каждым<del> а также<ins> тег?
 Rajitha10 авг. 2016 г., 13:22
Я пытаюсь отождествить слова с этими тегами <del> и <ins>, получить их как слово и отправить эти слова в средство проверки правописания. Это функциональность за регулярное выражение. Есть ли альтернативный способ сделать ту же функциональность

Ваш ответ на вопрос