1. rgb 中每个 , 后面的空格数量不固定
2. 十六进制表达式使用六位小写字母
3. 如果输入不符合 rgb 格式,返回原始输入
样例:
输入:'rgb(255, 255, 255) '
输入:'rgb(255, 255, 255) '
输出:'#ffffff'
'rgb(255, 255, 255)'
#ffffff
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('');
}
// 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; }
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('')
}