正则表达式代码不适用于Internet Explorer

时间:2012-01-02 10:28:20

标签: javascript regex internet-explorer

我有一个代码:

    function rgb2hex(rgb) {
        rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
        function hex(x) {
            return ("0" + parseInt(x).toString(16)).slice(-2);
        }
        return hex(rgb[1]) + hex(rgb[2]) + hex(rgb[3]);
    }

它只是获取一个rgb代码并将其转换为十六进制。它适用于所有浏览器(在IE9上也适用),但不适用于IE7或IE8

问题出在哪里?

2 个答案:

答案 0 :(得分:2)

您没有说明您在IE中实际得到的结果< 9(你认为失败的一些示例输入和结果字符串会特别有用)所以我所能做的只是猜测:

您正在使用parseInt(),并且在IE9中更改了parseInt()的实现。 (实际上,它在ECMAScript5中发生了变化,但在版本9之前IE还没有赶上它。)

如此处所示:http://msdn.microsoft.com/en-us/library/windows/apps/x53yedee(v=vs.94).aspx

  

从Internet Explorer 9标准模式开始,parseInt函数不会将前缀为“0”的字符串视为八进制。

显然,这意味着如果您的rgb值确实包含前导零,则根据浏览器版本,您将得到不同的结果。大概你想把数字当作基数10;通过更改hex()功能

可以轻松解决此问题
return ("0" + parseInt(x, 10).toString(16)).slice(-2);
// add radix here --------^

如果您的rgb值不包含前导零,那么,您如何更新问题以包含所有信息?

答案 1 :(得分:0)

我有一个更快更通用的解决方案:)你可以打电话:

function rgb2hex(rgb) {
      rgb = [].slice.call(arguments).join(",").match(/\d+/g);
      var hex,l;
      l=( hex = ( (rgb[0] << 16 ) + ( rgb[1] << 8 ) + +rgb[2] ).toString(16) ).length;
         while( l++ < 6 )
             hex="0"+hex
      return hex;
    }

rgb2hex( "rgb(0,0,255)" ); // "0000ff"
rgb2hex( "55,32,255" ); // "3720ff"
rgb2hex( 255, 30, 40 ); // "ff1e28"

演示:http://jsfiddle.net/Ld5Gs/