如何在coffeescript正则表达式中转义双引号?



我有以下一行coffeescript代码(dCnt和sDesc都是jQuery对象),它在移动HTML块的位置时对其进行一些基本的清理:

dCnt.append(sDesc.html().replace( /<div/gi, '<p' ).replace( /</div>/gi, '</p>' ).replace /sstyle="text-align: center;"/gi, '')

输出如下JavaScript:

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/</div>/gi, '</p>').replace(/sstyle="text-align: center;"/gi, ''));

前两个替换没有任何问题,但第三个替换需要做一些工作,以使coffeescript编译器能够处理,结果对我来说太有限和脆弱了。

到目前为止,我已经发现:

1)如果我在最后的替换周围有括号(),那么coffeescript将双引号解释为字符串并感到困惑(它最终将其中一个正斜杠解释为除法)。

2)如果我删除停止MATH错误的括号,那么正则表达式中的任何空白都会混淆编译器-上面代码的输出是空白而不是s(注意最后替换上的可怕的括号):

dCnt.append(sDesc.html().replace(/<div/gi, '<p').replace(/</div>/gi, '</p>').replace / (style = "text-align: center;" / gi), '');

如果替换项不在包含括号的集合中(即。从代码中删除dCnt.append()并在单独的行上处理它),那么正则表达式中的空白将导致编译器抛出一个Unexpected ','错误(这至少比生成垃圾JavaScript更可取…)。

由于需要删除括号(在coffeescript中是可选的,尽管我发现省略括号会严重降低代码的可读性),因此不可能将两个受此问题影响的函数调用链接起来。

有谁能想出一个不那么脆弱的解决方案来解决这个问题,仍然保留使用jQuery链接的能力吗?

问题似乎归结为以下几点:

s.replace(/ /, '')
s.replace / /, ''

被CoffeeScript编译器视为有歧义,它错误地解决了歧义。对吧?问题的根源是斜杠后面的空格,而不是双引号。CS看到这个:

/ /

作为尝试的除法,而不是正则表达式字面量。然而,这种:

/ /

被解释为匹配单个空格的正则表达式。

我可以想到一些解决方法:

  1. 使用s甚至[ t]。我认为这些比仅仅寻找一个空间更正确(当然,撇开整个"用正则表达式混淆HTML"问题)。
  2. 转义前导空格:/ style.../。比起正则表达式中的原始空格,我更喜欢这个,因为它更容易计数。

所以不是一个答案,真的(抱歉),但可能是一个确认,你没有失去理智。

最新更新