我有以下一行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看到这个:
/ /
作为尝试的除法,而不是正则表达式字面量。然而,这种:
/ /
被解释为匹配单个空格的正则表达式。
我可以想到一些解决方法:
- 使用
s
甚至[ t]
。我认为这些比仅仅寻找一个空间更正确(当然,撇开整个"用正则表达式混淆HTML"问题)。 - 转义前导空格:
/ style.../
。比起正则表达式中的原始空格,我更喜欢这个,因为它更容易计数。
所以不是一个答案,真的(抱歉),但可能是一个确认,你没有失去理智。