2010-12-11 23 views
4

私はこの正規表現({[^{}]*})で分割しようとしていますが、javascriptではIE7とFFの結果が異なります。ファイアーフォックスの結果は正しいものです。IE7のjavascriptのsplit regexのバグ

<style> 
.box.round { 
    border-radius: 10px; 
} 
</style> 
<script> 
jQuery(function ($) { 
    $('style').each(function() { 
    text = $(this).html(); 

    alert(text); 
    alert(text.split(/({[^{}]*})/)); 
    // result in FF: .box.round ,{border-radius: 10px;}, 
    // result in IE7: .box.round 
    }); 
}); 
</script> 

更新 は、それがIE7で動作するように、また、JavaScriptライブラリを追加することなく、正規表現を変更する方法はありますか?

+0

はい、これはバグです。あなたの質問は何ですか? –

+0

正規表現を変更する方法はありますか?IE7でもjavascriptライブラリを追加しないで動作しますか? – Codler

+0

正規表現だけでCSSを解析することは必ずしもうまくいくとは限りません。 – Pointy

答えて

0

私はregex ({[^{}]*})などで動作する解決法を作成しました。

function ieSplit(str, separator) { 
    var match = str.match(RegExp(separator, 'g')); 
    var notmatch = str.replace(new RegExp(separator, 'g'), '[|]').split('[|]'); 
    var merge = []; 
    for(i in notmatch) { 
     merge.push(notmatch[i]); 
     if (match != null && match[i] != undefined) { 
      merge.push(match[i]); 
     } 
    } 
    return merge; 
} 
alert(ieSplit(text, '({[^{}]*})')); 
// result in FF : .box.round ,{border-radius: 10px;}, 
// result in IE7: .box.round ,{border-radius: 10px;}, 
6

.split() regexesでのキャプチャされたグループの処理のバリエーションについての可能な解決策については、this old blog postを参照してください。その記事から

  • のInternet Explorerは、2つの区切り記号がデータで隣同士に表示される、または区切り文字が先頭で表示されたときに得られた配列(例えば、からほぼすべての空の値を除外またはデータの終わり)。区切り文字として文字列を使用する場合、IEには空の値が含まれているので、これは意味をなさない。
  • Internet ExplorerとSafariは、キャプチャされたカッコの値を返された配列にスプライスしません(この機能は単純なパーサーなどでは便利です)。
  • Firefoxは返された配列に非 - 参加する捕獲グループ。
  • Internet Explorer、Firefox、およびSafariには、分割仕様(実際はかなり複雑です)に従わない場合、さまざまなエッジケースバグが追加されています。

LevithanのXRegExpライブラリは本当に小さくて便利であり、それは修正が含まれています。

+0

ライブラリのない他のソリューションですか? – Codler

+1

さて、あなたはライブラリが何をしているのか見ることができます。それほど多くのコードではありません。私が知る限り、バグや非互換性を "修正"するだけでなく、あなたができることもあります。ライブラリはテストされているのでいいですし、正規表現についての本を書いたスマートな人間によって書かれました:-) – Pointy