Sanya530
Sanya530

Reputation: 1269

Regex replace text outside html tags

I have this HTML:

"This is simple html text <span class='simple'>simple simple text text</span> text"

I need to match only words that are outside any HTML tag. I mean if I want to match “simple” and “text” I should get the results only from “This is simple html text” and the last part “text”—the result will be “simple” 1 match, “text” 2 matches. Could anyone help me with this? I’m using jQuery.

var pattern = new RegExp("(\\b" + value + "\\b)", 'gi');

if (pattern.test(text)) {
    text = text.replace(pattern, "<span class='notranslate'>$1</span>");
}

I need to wrap all selected words (in this example it is “simple”) with <span>. But I want to wrap only words that are outside any HTML tags. The result of this example should be

This is <span class='notranslate'>simple</span> html <span class='notranslate'>text</span> <span class='simple'>simple simple text text</span> <span class='notranslate'>text</span>

I do not want replace any text inside

<span class='simple'>simple simple text text</span>

It should be the same as before replacement.

Upvotes: 30

Views: 24235

Answers (2)

Jerry
Jerry

Reputation: 71538

Okay, try using this regex:

(text|simple)(?![^<]*>|[^<>]*</)

Example worked on regex101.

Breakdown:

(         # Open capture group
  text    # Match 'text'
|         # Or
  simple  # Match 'simple'
)         # End capture group
(?!       # Negative lookahead start (will cause match to fail if contents match)
  [^<]*   # Any number of non-'<' characters
  >       # A > character
|         # Or
  [^<>]*  # Any number of non-'<' and non-'>' characters
  </      # The characters < and /
)         # End negative lookahead.

The negative lookahead will prevent a match if text or simple is between html tags.

Upvotes: 89

Explosion Pills
Explosion Pills

Reputation: 191729

^([^<]*)<\w+.*/\w+>([^<]*)$

However this is a very naive expression. It would be better to use a DOM parser.

Upvotes: 1

Related Questions