2009-09-21 5 views
8

IEで次のコードが動作しない理由はありますか? FFや他の正常なブラウザでは、文字列を指定された式で分割しますが、IEでは単に機能しません。JavaScript:splitはIEでは動作しませんか?

var str = "abc<font id=\"something\">def</font>gh"; 
alert(str.split(/(\<.*?\>|.)/).length); 

ありがとうございます。

+0

おそらくこのページは使用である:http://blog.stevenlevithan.com/archives/cross-browser-split – spender

+0

のだろうか、IEでばかげたもののそれらの一種である経営者によって決めバグや機能です?私はIE 8がまあまあだと思います! – thedp

+0

JOKE ON:プログラマーのためのバグは、コマーシャルの新しくてエキサイティングな機能です。 – ATorras

答えて

0

http://msdn.microsoft.com/en-us/library/h6e2eb7w%28VS.85%29.aspxの2番目の例のようにRegExpオブジェクトを使用する必要があります。

よろしくお願いいたします。

+0

それはそれとは関係ありません。問題は、splitメソッドに渡されるのではなく、正規表現の存在です。 – thedp

+0

申し訳ありませんが、私はうまく表現できませんでした。私はちょうどregexpの表現自体ではなく、正規表現の作成方法を指摘したかったのです。 IIRC /.../形式ではなく、RegExpオブジェクトを作成する際にいくつかの正規表現の問題を修正しました。 – ATorras

2

下記のコードをプログラムに追加しても問題ありません。

var split; 
// Avoid running twice; that would break the `nativeSplit` reference 
split = split || function (undef) { 

var nativeSplit = String.prototype.split, 
    compliantExecNpcg = /()??/.exec("")[1] === undef, // NPCG: nonparticipating capturing group 
    self; 

self = function (str, separator, limit) { 
    // If `separator` is not a regex, use `nativeSplit` 
    if (Object.prototype.toString.call(separator) !== "[object RegExp]") { 
     return nativeSplit.call(str, separator, limit); 
    } 
    var output = [], 
     flags = (separator.ignoreCase ? "i" : "") + 
       (separator.multiline ? "m" : "") + 
       (separator.extended ? "x" : "") + // Proposed for ES6 
       (separator.sticky  ? "y" : ""), // Firefox 3+ 
     lastLastIndex = 0, 
     // Make `global` and avoid `lastIndex` issues by working with a copy 
     separator = new RegExp(separator.source, flags + "g"), 
     separator2, match, lastIndex, lastLength; 
    str += ""; // Type-convert 
    if (!compliantExecNpcg) { 
     // Doesn't need flags gy, but they don't hurt 
     separator2 = new RegExp("^" + separator.source + "$(?!\\s)", flags); 
    } 
    /* Values for `limit`, per the spec: 
    * If undefined: 4294967295 // Math.pow(2, 32) - 1 
    * If 0, Infinity, or NaN: 0 
    * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296; 
    * If negative number: 4294967296 - Math.floor(Math.abs(limit)) 
    * If other: Type-convert, then use the above rules 
    */ 
    limit = limit === undef ? 
     -1 >>> 0 : // Math.pow(2, 32) - 1 
     limit >>> 0; // ToUint32(limit) 
    while (match = separator.exec(str)) { 
     // `separator.lastIndex` is not reliable cross-browser 
     lastIndex = match.index + match[0].length; 
     if (lastIndex > lastLastIndex) { 
      output.push(str.slice(lastLastIndex, match.index)); 
      // Fix browsers whose `exec` methods don't consistently return `undefined` for 
      // nonparticipating capturing groups 
      if (!compliantExecNpcg && match.length > 1) { 
       match[0].replace(separator2, function() { 
        for (var i = 1; i < arguments.length - 2; i++) { 
         if (arguments[i] === undef) { 
          match[i] = undef; 
         } 
        } 
       }); 
      } 
      if (match.length > 1 && match.index < str.length) { 
       Array.prototype.push.apply(output, match.slice(1)); 
      } 
      lastLength = match[0].length; 
      lastLastIndex = lastIndex; 
      if (output.length >= limit) { 
       break; 
      } 
     } 
     if (separator.lastIndex === match.index) { 
      separator.lastIndex++; // Avoid an infinite loop 
     } 
    } 
    if (lastLastIndex === str.length) { 
     if (lastLength || !separator.test("")) { 
      output.push(""); 
     } 
    } else { 
     output.push(str.slice(lastLastIndex)); 
    } 
    return output.length > limit ? output.slice(0, limit) : output; 
}; 

// For convenience 
String.prototype.split = function (separator, limit) { 
    return self(this, separator, limit); 
}; 

return self; 
}(); 
+0

参照および詳細については、コードはhttp://blog.stevenlevithan.com/archives/cross-browser-splitからです。 –

関連する問題