用正则表达式替换打开和关闭HTML标记

时间:2016-05-04 12:23:16

标签: javascript jquery html regex

我有以下标记:

<span style="font-size: 24px;"><font face="Courier New">[[code]]</font></span><br><p></p><span>{{name}}</span><span>[[otherCode]] </span>

并且我需要替换仅包裹双括号序列的span。因此,在上述情况下,我需要获得:

<div style="font-size: 24px;"><font face="Courier New">[[code]]</font></div><br><p></p><span>{{name}}</span><div>[[otherCode]] </div>

(即{{name}}周围的范围不会改变。

我知道通常不建议使用正则表达式,但在这种情况下,我觉得它是我唯一的选择。 (仅供我们使用jQuery和DOM访问,如果您觉得这些选项会更好。)

到目前为止,我一直在尝试使用正则表达式,但似乎无法避免{{}}这种情况。这就是我目前所拥有的:

/(<span[^>]*>(.*?\[\[\s*[^\]]+\s*\]\].*?)<\/span>)/gim

我认为解决方案是在第一个跨度结束标记处停止。

1 个答案:

答案 0 :(得分:1)

假设您只想避免使用{ s的HTML,您可以对此正则表达式使用一些变体:

<span[^>]*>[^{]*</span>

要确保跨度之间有[[ ]],您可以将正则表达式更改为:

<span[^>]*>[^{]*?\[\[[^\]]*\]\][^{]*?</span>

让我用一些间距重写一下:

<span[^>]*>
   [^{]*?   \[\[   [^\]]*   \]\]   [^{]*?
</span>

(请注意,您可能必须转义/。)

由于您要将span替换为div,因此您可以添加捕获括号,如下所示:

<span([^>]*>[^{]*?\[\[[^\]]*\]\][^{]*?</)span>

您的替换应为:<div$1div>

当我在你的一个样本上在线测试它时,这是有效的,但如果HTML中有某些字符,它将失败。根据HTML结构的不同,它也可能会中断,特别是如果它的结构很差。

在这些情况下使用真正的解析器可能更容易。或者,您仍然可以使用正则表达式,因为您可以分解HTML并确保您只传递它可以成功处理的块。