2

次のような 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, ''));

最初の 2 つの置換は問題を引き起こしませんが、3 番目の置換は、coffeescript コンパイラが処理できる何かを考え出すのに少し手間がかかりました。

これまでのところ、次のことを発見しました。

1) 最後の置換の前後に括弧 () がある場合、coffeescript は二重引用符を文字列として解釈し、混乱します (スラッシュの 1 つを除算として解釈してしまいます)。

2) 数学エラーを停止する括弧を削除すると、正規表現内の空白がコンパイラを混乱させます。上記のコードの \s の代わりに空白を使用した出力は (最終的にひどく壊れた括弧に注意してください)交換):

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

置換が括弧を含むセットに含まれていない場合 (つまり、コードから dCnt.append() を削除し、別の行でそれを処理する)、正規表現の空白により、コンパイラは予期しない ',' をスローします。エラー (これは少なくとも、ガベージ JavaScript を生成するよりは望ましい方法です...)。

括弧を削除する必要があるため (coffeescript ではオプションですが、削除するとコードの可読性が大幅に低下することがわかりました)、この問題に悩まされている 2 つの関数呼び出しをチェーンすることはできません。

jQuery チェーンをそのまま使用する機能を維持しながら、この問題に対する脆弱性の低いソリューションを思い付くことができる人はいますか?

4

1 に答える 1

1

問題は次のように要約されます。

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

CoffeeScript コンパイラによってあいまいであると見なされ、あいまいさが正しく解決されません。右?問題の原因は、二重引用符ではなく、スラッシュに続くスペースです。CS はこれを見ます:

/ /

正規表現リテラルではなく、試行された除算として。ただし、これは次のとおりです。

/\ /

単一のスペースに一致する正規表現として解釈されます。

私はいくつかの回避策を考えることができます:

  1. \sまたはを使用し[ \t]ます。これらは、単一のスペースを探すよりも正しいと思います(もちろん、「HTMLを正規表現でマングリングする」問題全体を脇に置きます)。
  2. 先頭のスペースをエスケープします: /\ style.../. 実際には、正規表現の生のスペースよりもこれを好みます。これにより、数えやすくなります。

ですから、本当の答えはあまりありません (申し訳ありません) が、あなたが正気を失っていないことの確認になるかもしれません。

于 2012-12-29T01:28:53.850 に答える