REGEX匹配起始和结束span标签而没有内部文本

时间:2012-01-16 13:36:12

标签: javascript regex mootools

我使用以下RegEx在字符串中进行替换:

<\/?(span)\b(?:\s+class="highlight")?>

但是这个正则表达式有一个缺陷......以此示例代码为例:

<p>
   Some text here
   <span class="highlight">This is highlighted</span>
   <span>This is not highlighted</span>
</p>

我的正则表达式将匹配两个span标签,尽管我只想要设置class =“highlight”的那个。如何使用RegEx实现这一目标?

PS:请不要告诉我,我不应该使用RegEx,因为我会降低你的答案,因为它是偏离主题的。这是RegEx家伙的问题。

编辑:基于下面接受的答案,我使用以下正则表达式进行替换 注意:代码在javascript(mootools)

var regex = new RegExp("(<span[^>]+class\\s*=\\s*(\"|')highlight\\2[^>]*>)(.*?)(</span>)",'g');
var replaced = element.get('html').replace(regex, "$3");
element.set('html', replaced);

上面的正则表达式会在这里用“some text here”替换一些文本(不带双引号)

3 个答案:

答案 0 :(得分:5)

这应该给予最大的灵活性。

(<span[^>]+class\s*=\s*("|')highlight\2[^>]*>)[^<]*(</span>)

更新:

开始和结束标记所需的捕获组是\ 1和\ 3。

答案 1 :(得分:2)

只是为了向您展示替代解决方案不仅可能是使用正则表达式而且更好

$$('span.highlight').each(function (node, idx, Elem) {
    var txt = document.createTextNode(Elem.get('text'));
    node.parentNode.replaceChild(txt, node)
});

看到这个小提琴:http://jsfiddle.net/Tomalak/umgZp/

(这只是我的首要任务,到目前为止我没有接触过MooTools。可能会有更优雅的方式。)

答案 2 :(得分:0)

您显然说明class=highlight部分是可选的,方法是将?放在捕获它的组前面。

这应该适合你:

var regex = /(?:<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>|<\/span>/;

这还包括具有a b c highlight e f g等类属性的SPAN标记。

此外,如果您想捕获其匹配结尾的SPAN标记,您可以使用此标记,并分别访问组1和3作为开头和结尾标记:

var regex = /(<span\s+[^>]*?\s*class\s*=\s*('|")(?:\S+\s+)?highlight(?:\s+\S+)?\1[^>]*>).*?(<\/span>)/;