user1711384
user1711384

Reputation: 353

Regular expression does not work

I am using the following regular expression in Javascript:

comment_body_content = comment_body_content.replace(
  /(<span id="sc_start_commenttext-.*<\/span>)((.|\s)*)(<span id="sc_end_commenttext-.*<\/span>)/,
  "$1$4"
);

I want to find in my HTML code this tag <span id="sc_start_commenttext-330"></span> (the number is always different) and the tag <span id="sc_end_commenttext-330"></span>. Then the text and HTML code between those tags should be deleted and given back.

Example before replacing:

Some text and code
<span id="sc_start_commenttext-330"></span>Some text and code<span id="sc_end_commenttext-330"></span>
Some Text and code

Example after replacing:

Some text and code
<span id="sc_start_commenttext-330"></span><span id="sc_end_commenttext-330"></span>
Some text and code

Sometimes my regular expression works and it replaces the text correctly, sometimes not - is there a mistake? Thank you for help!

Alex

Upvotes: 0

Views: 150

Answers (4)

Terje Rosenlund
Terje Rosenlund

Reputation: 163

I agree that it's normaly a bad ide to use regexp to parse html but it can be used effectly on non-nested html

Using RegExp:

var str = 'First text and code<span id="sc_start_commenttext-330"></span>Remove text<span id="sc_end_commenttext-330"></span>Last Text and code';
var re = /(.*<span id="sc_start_commenttext-\d+"><\/span>).*(<span id="sc_end_commenttext-\d+"><\/span>.*)/;
str.replace(re, "$1$2");

Result:

First text and code<span id="sc_start_commenttext-330"></span><span id="sc_end_commenttext-330"></span>Last Text and code

Upvotes: 0

Alexander
Alexander

Reputation: 23537

Using DOM.

​var $spans = document.getElementsByTagName("span");
var str = "";

for(var i = 0, $span, $sibling; i < $spans.length; ++i) {
    $span = $spans[i];
    if(/^sc_start_commenttext/i.test($span.id)) {
        while($sibling = $span.nextSibling) {
            if(/^sc_end_commenttext/i.test($sibling.id)) {
                break;
            }
            str += $sibling.data;
            $span.parentNode.removeChild($sibling);
        }
    }
}

console.log("The enclosed string was: ", str);

Here you have it.

Upvotes: 1

Gumbo
Gumbo

Reputation: 655189

You should use a pattern that matches the start with its corresponding end, for example:

/(<span id="sc_start_commenttext-(\d+)"><\/span>)[^]*?(<span id="sc_end_commenttext-\2"><\/span>)/

Here \2 in the end tag refers to the matched string of (\d+) which matches the digits 330 in the start tag. [^] is a simple expression for any character.

Upvotes: 2

Grzegorz Gierlik
Grzegorz Gierlik

Reputation: 11232

I would start to replace .* with [0-9]+"> -- if I understand correctly your intention.

Upvotes: 0

Related Questions