题目:
请编写一个JavaScript 函数toRGB,它的作用是转换CSS中常用的颜色编码。 要求:
alert(toRGB("#0000FF")); // 输出 rgb(0, 0, 255)
alert(toRGB("invalid")); // 输出 invalid
alert(toRGB("#G00")); // 输出 #G00
答:
var str = "#0000FF";
document.write(toRGB(str));
function toRGB(str){
var pattern1=/^#([0-9A-F]{2})([0-9A-F]{2})([0-9A-F]{2})$/i;
var pattern2=/^#([0-9A-F])([0-9A-F])([0-9A-F])$/i;
var result;
if(pattern1.test(str)){
result=pattern1.exec(str);
}
else if(pattern2.test(str)){
result=pattern2.exec(str);
}
else{
return str;
}
var str_r=RegExp["$1"];
var str_g=RegExp["$2"];
var str_b=RegExp["$3"];
var r_num=HEXtoDEC(str_r);
var g_num=HEXtoDEC(str_g);
var b_num=HEXtoDEC(str_b);
var css_color=[r_num,g_num,b_num].join(",");
css_color="rgb("+css_color+")";
return css_color;
}
function HEXtoDEC(str)
{
var hex_num="0x"+str;
var num=parseInt(hex_num);
return num;
}
上述代码需要注意的!:模式中
有两个限定符,一个^一个$,分别限定匹配的开始和结尾。另外!!一个很神奇的事情是,直接用$1获取分组,则出现错误。如下代码获取无论是FF,还是IE都是有问题的!!
/*
var str_r="$1";
var str_g="$2";
var str_b="$3";
var str_r=$_1;
var str_g=$_2;
var str_b=$_3;
*/
只能用
RegExp["$1"]的静态属性才可以。
另外~ 一个C语言的习惯。。。。定义函数后面的形参习惯加上var,例如function HEXtoDEC(var str),但是!!!这样编译出错。。。。
函数parseInt是一个很有用的函数,它可以转换到各种进制。案例中的转换是一种方式,另外我们可以用另一种方法。因为parseInt可以接收第二个可选参数,这个参数指定数字转换的基数,合法的取值范围是2~36。例如:
parseInt("11",2); //=>3 (1*2+1)
parseInt("ff",16); //=>255 (15*16+15)
哦~ 忘记了!还有一个有趣的是,例子中关于数字整合的处理,用到了数组的方法 join~~~这个挺方便而且简明还效率高。
文中提取R,G,B三个参数可以用到match方法。例如:
<span style="background-color: rgb(255, 204, 204);">var pattern3=/[0-9A-F]{2}/g; //g开启全局匹配,如果不开启全局匹配,下面的m只有一个值,就是m[0]=00;
var m=str.match(pattern3); //m[0]=00, m[1]=00, m[2]=FF;
var val=m.join(",");</span>
不管你信不信,反正本人看到另一个匹配方式很兴奋!!!