将 rgb 颜色字符串转换为十六进制的形式,如 rgb(255, 255, 255) 转为 #ffffff
1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
// slice function rgb2hex(sRGB) {if(sRGB.slice(0,4)!=='rgb(' || sRGB.slice(-1)!==')') return sRGB; var rgb = sRGB.slice(4,-1).split(','); if(rgb.length<3) return sRGB; var rs='#'; var num; for(var i=0;i<3;i++){ if(isNaN((num=parseInt(rgb[i])))) return sRGB; if(num>255 || num<0) return sRGB; rs+=num.toString(16).length===1?'0'+num.toString(16):num.toString(16); } return rs; }
function rgb2hex(sRGB) { let res = '#'; let reg = /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/; if (reg.test(sRGB)) { let n1 = RegExp.$1, n2 = RegExp.$2, n3 = RegExp.$3; if(n1 < 0 || n1 > 255 || n2 < 0 || n2 > 255 || n3 < 0 || n3 > 255) res = sRGB; else { n1 = parseInt(n1, 10).toString(16); n2 = parseInt(n2, 10).toString(16); n3 = parseInt(n3, 10).toString(16); n1 = (n1.length == 1) ? ('0' + n1) : n1; n2 = (n2.length == 1) ? ('0' + n2) : n2; n3 = (n3.length == 1) ? ('0' + n3) : n3; res += (n1 + n2 + n3); } } else { res = sRGB; } return res; }
function rgb2hex(sRGB) { var strFormat=function (str,num) { str=(+str).toString(16); str=str.length<2?str+str:str; return str; }; sRGB=sRGB.replace(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/g,function (str,s1,s2,s3) { return "#"+strFormat(s1,16)+strFormat(s2,16)+strFormat(s3,16); }); return sRGB; }
function rgb2hex(sRGB) { const rgbReg = /rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)/ if (rgbReg.test(sRGB)) { let rgbArray = [RegExp.$1, RegExp.$2, RegExp.$3] // 判断是否超过255,只要有一个不满足要求就直接返回原字符串 const inCorrectRGB = rgbArray.some((rgbNum) => rgbNum > 255 || rgbNum < 0) if (inCorrectRGB) return sRGB // 转16进制 let ret = rgbArray .map((rgb) => parseInt(rgb)) .map((rgb) => { let hex = rgb.toString(16) hex = hex.length < 2 ? '0' + hex : hex return hex }) .join('') return `#${ret}` } return sRGB }
使用eval,定义一个rgb function:
function rgb2hex(sRGB) { try{ return eval(sRGB) } catch(err){ return sRGB } } function rgb(r,g,b){ let rH=r.toString(16) let gH=g.toString(16) let bH=b.toString(16) rH=rH.length==1?'0'+rH:rH gH=gH.length==1?'0'+gH:gH bH=bH.length==1?'0'+bH:bH return "#"+rH+gH+bH }
function rgb2hex(sRGB) { if(!/\((\s*(\d+)\s*\,){2}\s*(\d+)\s*\)/.test(sRGB)) return sRGB; let str = "#"; sRGB.match(/([0-9]+)/g).map(i=>parseInt(i)).filter(i=>i>-1&&i<256).forEach(item => { str += ("0"+item.toString(16)).slice(-2); }); return str; }
神奇的是,正则用/^(rgb|RGB)/也是可以的
function rgb2hex(sRGB) { let req = /^(rgb|RGB)\((\d+,\s*){2}(\d+)\)$/; if(!req.test(sRGB)) return sRGB; let arr = sRGB.replace(/(rgb|RGB|\(|\))/g, '').split(','); let hex = '#'; for(let i=0; i<arr.length; i++) { hex += ('0' + parseInt(arr[i]).toString(16)).slice(-2); } return hex; }
function rgb2hex(sRGB) { let reg=/rgb\(\s*(\d+),\s*(\d+),\s*(\d+)\)/g; let str='#'; if(!reg.test(sRGB)){return sRGB;} return sRGB.replace(reg,function(a,o,t,s){ for(let i=1;i<=3;i++){ if(0<=arguments[i]&&arguments[i]<=255){ str+=arguments[i]<16?'0'+arguments[i]:(+arguments[i]).toString(16); }else{ return sRGB; } } return str; }); }
function rgb2hex(sRGB) { var reg=/^rgb\((\d+)\s*\,\s*(\d+)\s*\,\s*(\d+)\)$/; var cast = function(n) { var n = parseInt(n); return ( n < 16 ? '0' : '' ) + (n.toString(16)) ; } if(reg.test(sRGB)){ var numlist=reg.exec(sRGB); var result=''; for(var i=1;i<numlist.length;i++){ result+=cast(numlist[i]); } return '#'+result; }else{ return sRGB; } }
function rgb2hex(sRGB) { var regexp=/rgb\((\d+),\s*(\d+),\s*(\d+)\)/; var ret=sRGB.match(regexp); if(!ret){ return sRGB; }else{ var str='#'; for(var i=1;i<=3;i++){ var m=parseInt(ret[i]); if(m<=255&&m>=0){ str+=(m<16?'0'+m.toString(16):m.toString(16)); }else{ return sRGB; } } return str; } }
//方式1:行数最少
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
return '#'+('0'+(+$1).toString(16)).slice(-2)+('0'+(+$2).toString(16)).slice(-2)+('0'+(+$3).toString(16)).slice(-2);
});
}
//方式2:行数较少,代码较少,容易理解
function rgb2hex(sRGB) {
return sRGB.replace(/^rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)$/,function($0,$1,$2,$3){
return '#'+toHex($1)+toHex($2)+toHex($3);
});
}
function toHex(str){
return ('0'+(+str).toString(16)).slice(-2);
}
//方式3:行数较少,代码最少,容易理解? //
function rgb2hex(sRGB){
var result=['#'];
if(!/rgb\(\d+(,\s*\d+){2}\)/.test(sRGB)){
return sRGB;
}
sRGB.replace(/\d+/g,function($0){
result.push(('0'+(+$0).toString(16)).slice(-2));
});
return result.join('');
}
padStart
方法,所以使用三元判断的方式处理结果是否需要补位 #
符号 function rgb2hex(sRGB) { // 填写JavaScript let branketLeft = sRGB.indexOf('(') + 1 let branketRight = sRGB.indexOf(')') if (branketRight < 0) return sRGB let result = sRGB.slice(branketLeft, branketRight).split(',').map(item => (+item).toString(16).length !== 2 ? '0' + (+item).toString(16) : (+item).toString(16)) return '#' + result.join('') }