Kirill Miniaev
Kirill Miniaev

Reputation: 303

Regex Help for content between two strings (javascript)

Hoping someone might help. I have a string formatted like the example below:

Lipsum text as part of a paragraph here, yada. |EMBED|{"content":"foo"}|/EMBED|. Yada and the text continues...

What I am looking for is a Javascript RegEx to capture the content between the |EMBED||/EMBED| 'tags', run a function on that content, and then to replace the entire |EMBED|...|/EMBED| string with the return of that function.

The catch is that I may have multiple |EMBED| blocks within a larger string. For example:

Yabba...|EMBED|{"content":"foo"}|/EMBED|. Dabba-do...|EMBED|{"content":"yo"}|/EMBED|.

I need the RegEx to capture and process each |EMBED| block separately, since the content contained within will be similar, but unique.

My initial thought is that I could just have a RegEx that captures the first iteration of the |EMBED| block, and the function which replaces this |EMBED| block is either part of a loop or recursion to continuously find the next block and replace it, until no more blocks are found in the string.

...but this seems expensive. Is there a more eloquent way?

Upvotes: 0

Views: 235

Answers (2)

Adilson de Almeida Jr
Adilson de Almeida Jr

Reputation: 2755

This is the cod which iterate through the matches of the regex:

var str = 'Lipsum text as part of a paragraph here, yada. |EMBED|{"content":"foo"}|/EMBED|. Yada and the text continues...';
var rx = /\|EMBED\|(.*)\|\/EMBED\|/gi;
var match;
while (true)
{
    match = rx.exec(str);
    if (!match)
        break;
    console.log(match[1]); //match[1] is the content between "the tags"
}

Upvotes: 1

TimoStaudinger
TimoStaudinger

Reputation: 42530

You can use String.prototype.replace to replace a substring found via a regular expression with a modified version of the match using a mapping function, e.g.:

var input = 'Yabba...|EMBED|{"content":"foo"}|/EMBED|. Dabba-do...|EMBED|{"content":"yo"}|/EMBED|.'

var output = input.replace(/\|EMBED\|(.*?)\|\/EMBED\|/g, function(match, p1) {
  return p1.toUpperCase()
})

console.log(output) // "Yabba...{"CONTENT":"FOO"}. Dabba-do...{"CONTENT":"YO"}."


Make sure that you use a non-greedy selector .*? to select the content between the delimiters to allow multiple replacements per string.

Upvotes: 2

Related Questions