如果我有字符串rgba(111,222,333,0.5)
我如何可以提取單個顏色的字符串,即如何從rgb/rgba字符串獲取紅色的綠色和藍色值?
red => 111
green => 222
blue => 333
opacity => 0.5
我想能夠使用這個整潔乾淨的解決方案,所以我假設一個正則表達式會最好?
如果我有字符串rgba(111,222,333,0.5)
我如何可以提取單個顏色的字符串,即如何從rgb/rgba字符串獲取紅色的綠色和藍色值?
red => 111
green => 222
blue => 333
opacity => 0.5
我想能夠使用這個整潔乾淨的解決方案,所以我假設一個正則表達式會最好?
我會避免正則表達式可預見的字符串,並建議:
var colorString = "rgba(111,222,333,0.5)",
colorsOnly = colorString.substring(colorString.indexOf('(') + 1, colorString.lastIndexOf(')')).split(/,\s*/),
red = colorsOnly[0],
green = colorsOnly[1],
blue = colorsOnly[2],
opacity = colorsOnly[3];
或者,因爲你希望它返回一個對象:
var colorString = "rgba(111,222,333,0.5)",
colorsOnly = colorString.substring(colorString.indexOf('(') + 1, colorString.lastIndexOf(')')).split(/,\s*/),
components = {};
components.red = colorsOnly[0];
components.green = colorsOnly[1];
components.blue = colorsOnly[2];
components.opacity = colorsOnly[3];
console.log(colorsOnly, components);
的正則表達式,這將是:
^rgba\(([^,]+),([^,]+),([^,]+),([^,]+)\)$
Javascript代碼:
var regex = /^rgba\(([^,]+),([^,]+),([^,]+),([^,]+)\)$/g;
var input = "rgba(111,222,333,0.5)";
if(regex.test(input)) {
var matches = input.match(regex);
for(var match in matches) {
alert(matches[match]);
}
} else {
alert("No matches found!");
}
您可能要修剪的比賽和/或值轉換爲數字,以獲得所需的RGBA值JavaScript的。
玩這個如果正則表達式本身參數之間你想把手的空間,它可能會開始面色難看是這樣的:
^rgba\(\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*,\s*([^,\s]+)\s*\)$
,如果它總是在RGBA格式,你可以做一些事情像這樣:
var str = 'rgba(111,222,333,0.5)'
var red = str.substr(5,3);
var green = str.substr(9,3);
var red = str.substr(13,3);
使大衛更簡單和expainatory
var colorString = "rgba(111,222,333,0.5)";
var colorsOnly = colorString.split(")"); //gives "rgba(111,222,333,0.5" at index 0
var colorsOnly = colorString[0].split("("); //gives "111,222,333,0.5 at index 1
var colorsOnly = colorString[1].split(",");
給出 「111」[0]時, 「222」,在[1], 「333」,在[2]和 「0.5」,在[3] 但注意:所有這些都具有字符串數據類型,因爲所有這些都是子字符串。
red = parseInt(colorsOnly[0]);
green = parseInt(colorsOnly[1]);
blue = parseInt(colorsOnly[2]);
opacity = parseFloat(colorsOnly[3]);
使用parseInt()
和parseFloat()
方法的字符串轉換成整數和浮點RESP。
這不起作用。頂部代碼塊的第3行和第4行應該是var colorsOnly = colorsOnly [0] .split(「(」);然後var colorsOnly = colorsOnly [1] .split(「,」); – Dss
對於艾哈邁德比拉爾的回答,我有些事要糾正。如果我錯了,請隨時糾正我! :)
它應該是:
var colorsOnly = colorString.split(")");
var colorsOnly = colorString.split("(");
var colorsOnly = colorsOnly[1].split(",");
通知第四句的變化。由於ColosOnly從第三句已經代表了「(」分裂後的結果,所以我認爲它應該在第三句中是colorsOnly[1]
,我自己試了一下並得到證實。
再次,如果我錯了,請也隨時糾正我!:)
這不起作用,但你「重新在正確的軌道上,因爲它是由第2覆蓋,不保存任何的第一行不會做任何事情 這是很難讀,但你可以事事連鎖在一起:。 VAR colorsOnly = colorString.split(‘)’ )[0] .split( 「(」)[1] .split( 「」); – sirclesam
出於好奇,我對你爲什麼這麼建議的原因感興趣 - 是否正則表達式的資源密集程度更高,還是比較慢? – Dan
正則表達式在處理和匹配各種表達式方面可能相當昂貴。它並不總是比較慢,它只是簡單的字符串或數組函數往往會更便宜一些。我沒有進行任何比較來確定這個問題的更快解決方案,但是我更喜歡在可能的情況下避免使用正則表達式,如果可以使用更簡單的方法。所以...個人偏見,和(通常)昂貴的正則表達式引導我推薦這種替代方案。 –
所以我在這個應用程序中對此感到好奇,所以我在我正在使用的正則表達式解決方案,鏈接分割命令和這裏提到的解決方案之間進行了比較。 100,000個元素的結果爲:正則表達式:76ms分割:121ms子字符串:96ms - 結果在多次運行中保持相似。所以在這種情況下,正則表達式更快,但不是太多。 – sirclesam