1

I have the following html tag (which is custom):

<meltdown-code data-lang="HTML">
    <span><br>
        <p>Hi</p><br>
    </span><br>
</meltdown-code>

Simple enough. Now, I'm trying to make the HTML tags show as plain text, instead of being rendered as a separate element. To do that, I am replacing all the < with &lt;, and all the > with &gt;

tagHTML.replace(/</g, '&lt;')

The problem: This also replaces the <br> tags, which doesn't create a new line. Here is the solution, in a perfect world:

tagHTML.replace(/</g, '&lt;', {exceptions: '<br>'})

Obviously, that's not how it works. Any help is appreciated.

Thanks!

Halo
  • 1,730
  • 1
  • 8
  • 31
  • Have a look at [negative lookaheads](https://stackoverflow.com/a/1749956/18244921)! – kelsny Sep 24 '22 at 23:25
  • @caTS, thanks for your instant reply! I will check them out and get back to you – Halo Sep 24 '22 at 23:25
  • @caTS, sorry... I'm not sure I understand. I'm not really good with regex. Would you mind explaining it to me? – Halo Sep 24 '22 at 23:27

1 Answers1

2

Negative lookahead for <br> before matching <.

const text = `<meltdown-code data-lang="HTML">
    <span><br>
        <p>Hi</p><br>
    </span><br>
</meltdown-code>`;

const output = text.replace(/(?!<br>)<([^>]+)>/g, '&lt;$1$gt;');
console.log(output);
<code></code>
CertainPerformance
  • 356,069
  • 52
  • 309
  • 320