2016-08-10 5 views
3

У меня есть контент, содержащий контент вместе с 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 групп.

+0

Разве я не видел этот вопрос repeatetly отвечал с разными разными счетами? –

+0

Содержание может быть таким же, потому что все, что он содержит, это и теги, но вопрос о другом – Rajitha

+0

Можете ли вы упростить объяснение того, что вы пытаетесь сопоставить или заменить? – sln

ответ

0

Это действительно слишком много для регулярного выражения - если вы хотите что-то изменить в будущем, это будет серьезно неподъемным и трудным для исправления. Использование 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>

+0

То, что я пытаюсь, чтобы определить слова с этими и тегами и получить их как слово и отправить эти слова в проверку орфографии. Это функциональность для регулярного выражения. Есть ли альтернативный способ для выполнения той же функциональности? – Rajitha

+0

@ Rajitha Я не совсем понимаю. Запустите второй фрагмент - делает ли это то, что вы хотите? Вам просто нужен текст между каждым тегом '' и' '? –

Смежные вопросы