2017-05-05 4 views
0

Ich habe die folgende Funktion, die mehrere Ersetzungsaktionen auf einer einzigen Zeichenfolge inputHtml führt. Es funktioniert gut, dauert aber zu lange. Ist es möglich, es zu beschleunigen, indem man sie kombiniert?Javascript: Führen Sie mehrere "ersetzen" in einer einzigen Zeichenfolge

/* Receives HTML code and returns the plain text contained in the HTML code */ 
function decodeHtml(inputHtml) { 
    const commentsRemoved = inputHtml.replace(/<!--[\s\S]*?-->/gm, ''); 
    const linebreaksAdded = commentsRemoved.replace(/<br>/gm, '\n'); 
    const tagsRemoved = linebreaksAdded.replace(/<(?:.|\n)*?>/gm, ''); 
    const linebreaksRemoved = tagsRemoved.replace(/^\s*[\r\n]/gm, ''); 
    const plainText = entities.decode(linebreaksRemoved); 

    return plainText; 
} 
+0

Es ist sicherlich möglich! Was hast du probiert? –

+2

Das '(?:. | \ N) *?' Ist was es wirklich verlangsamt. Wird es bereits als '[\ s \ S] *? –

+0

Verwenden Sie nodejs? –

Antwort

1

Da einige Ersatz mit Newline tun, es in einem einzigen
Pass regex zu machen, müssen Sie ein wenig die Kombination von Funktionalität zu tun.

Regex erklärt

(<!-- [\s\S]*? -->)   # (1), return '' 
| 
    (?:       # Blank lines, simulate^multiline 
     (\r? \n)     # (2), return $2 
     | (       # (3 start) 
       (\r?)      # (4), return $4 + '\n' 
       <br> 
     )        # (3 end) 
    ) 
    (?: \s | <br> | <!-- [\s\S]*? -->)* 
    \r? 
    (?: \n | <br>) 
| 
    (<br>)      # (5), return '\n' 
| 
    (< [\s\S]*? >)    # (6), return '' 

JS Code

var input = 'here<br> <br> <br> <br><!-- <br> --> <br><br><br><br>and here<br>and there '; 
 

 
var output = input.replace(/(<!--[\s\S]*?-->)|(?:(\r?\n)|((\r?)<br>))(?:\s|<br>|<!--[\s\S]*?-->)*\r?(?:\n|<br>)|(<br>)|(<[\s\S]*?>)/g, 
 
    function(m,p1,p2,p3,p4,p5,p6) { 
 
     if (p1 || p6) 
 
      return ""; 
 
     // 
 
     if (p2) 
 
      return p2; 
 
     if (p3) 
 
      return p4 + "\n"; 
 
     // 
 
     if (p5) 
 
      return "\n"; 
 
     }); 
 
     
 
console.log(output);

Eingangs

here<br> <br> <br> <br><!-- <br> --> <br><br><br><br>and here<br>and there 

Output

here 
and here 
and there 
Verwandte Themen