0

我在 Javascript 中使用以下正则表达式:

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

我想在我的 HTML 代码中找到这个标签<span id="sc_start_commenttext-330"></span>(数字总是不同的)和标签<span id="sc_end_commenttext-330"></span>. 然后这些标签之间的文本和 HTML 代码应该被删除并返回。

替换前的示例:

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

替换后的示例:

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

有时我的正则表达式有效并且它正确地替换了文本,有时不是 - 有错误吗?谢谢你的帮助!

亚历克斯

4

4 回答 4

2

您应该使用匹配开头和相应结尾的模式,例如:

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

这里\2的结束标记是指匹配的字符串与开始标记(\d+)中的数字匹配。是任何字符的简单表达式。330[^]

于 2012-12-09T16:14:51.550 回答
1

使用 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);

在这里你有它。

于 2012-12-09T16:42:30.010 回答
0

我同意使用 regexp 来解析 html 通常是一个坏主意,但它可以有效地用于

使用 RegExp 的非嵌套 html:

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");

结果:

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

于 2012-12-11T19:15:02.547 回答
0

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

于 2012-12-09T16:14:42.563 回答