2

我有以下咖啡脚本代码行(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, ''));

前两个替换没有问题,但第三个需要一些工作才能提出咖啡脚本编译器可以处理的东西,结果对我来说过于局限和脆弱。

到目前为止,我发现:

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 链接吗?

4

1 回答 1

1

问题似乎归结为这些:

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

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

/ /

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

/\ /

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

我可以想到几个解决方法:

  1. 使用\s甚至[ \t]. 我认为这些比仅仅寻找一个空格更正确(当然,抛开整个“用正则表达式处理 HTML”问题)。
  2. 逃脱领先的空间:/\ style.../。实际上,我更喜欢正则表达式中的原始空格,因为它使它们更容易计数。

因此,实际上并没有太多答案(对不起),但也许可以确认您没有失去理智。

于 2012-12-29T01:28:53.850 回答