我有以下标记:
<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
我认为解决方案是在第一个跨度结束标记处停止。
答案 0 :(得分:1)
假设您只想避免使用{
s的HTML,您可以对此正则表达式使用一些变体:
<span[^>]*>[^{]*</span>
要确保跨度之间有[[ ]]
,您可以将正则表达式更改为:
<span[^>]*>[^{]*?\[\[[^\]]*\]\][^{]*?</span>
让我用一些间距重写一下:
<span[^>]*>
[^{]*? \[\[ [^\]]* \]\] [^{]*?
</span>
(请注意,您可能必须转义/
。)
由于您要将span
替换为div
,因此您可以添加捕获括号,如下所示:
<span([^>]*>[^{]*?\[\[[^\]]*\]\][^{]*?</)span>
您的替换应为:<div$1div>
。
当我在你的一个样本上在线测试它时,这是有效的,但如果HTML中有某些字符,它将失败。根据HTML结构的不同,它也可能会中断,特别是如果它的结构很差。
在这些情况下使用真正的解析器可能更容易。或者,您仍然可以使用正则表达式,因为您可以分解HTML并确保您只传递它可以成功处理的块。