2014-09-09 4 views
0

Есть ли встроенная функция PHP для получения следующего результата?Строка RGB для массива

$rgba = "rgba(246, 24, 35, 0.8)"; 
    $splittedRgba = splitRGB($rgba); 

    $rgb = "rgb(246, 24, 35)"; 
    $splittedRgb = splitRGB($rgb); // splitRGB is the function I need 
    /* 
     $splittedRgba['r'] = 246; 
     $splittedRgba['g'] = 24; 
     $splittedRgba['b'] = 35; 
     $splittedRgba['a'] = 0.8; 

     $splittedRgb['r'] = 246; 
     $splittedRgb['g'] = 24; 
     $splittedRgb['b'] = 35; 
     $splittedRgb['a'] = 1; 
    */ 
+3

Существует не из произвольной строки, но preg_match() будет выполнять работу с соответствующим регулярное_выражением –

+2

PHP является набором инструментов. в нем есть отвертки, молотки, возможно, измерительная лента и карандаш. Вы ожидаете, что он будет содержать полностью развитый дом с сантехникой и электропроводкой для ** КАЖДОЙ ** возможной вещи, которую вы хотите. Вместо того, чтобы метаться вокруг, глядя на консервный нож, который приготовит ваш ужин в честь благодарения и поможет вашим детям попасть в колледж, вы должны научиться использовать базовые инструменты, которые PHP предоставляет для создания этого инструмента «все-в-одном». –

+1

@MarcB - не забывайте о двойном когте –

ответ

6

Вы можете использовать preg_match, но вы также можете использовать более простую функцию: sscanf

$rgba = sscanf("rgba(246, 24, 35, 0.8)", "rgba(%d, %d, %d, %f)"); 

print_r($rgba); 

$rgb = sscanf("rgb(246, 24, 35)", "rgb(%d, %d, %d)"); 

print_r($rgba); 

%d соответствует десятичное число, %f совпадает с числом с плавающей точкой.

Ссылки:

http://php.net/list

http://php.net/sscanf

Не ожидать, что люди, чтобы предоставить вам полностью рабочий супер функциональный код. Ответы здесь дают явные ошибки, которые вы сделали, и должны дать вам идею, помогающую решить более сложную проблему.

Так что ваша часть здесь будет что-то вроде:

function parseRGBa($rgba) { 
    $rgba = trim(str_replace(' ', '', $rgba)); 
    if (stripos($rgba, 'rgba') !== false) { 
     $res = sscanf($rgba, "rgba(%d, %d, %d, %f)"); 
    } 
    else { 
     $res = sscanf($rgba, "rgb(%d, %d, %d)"); 
     $res[] = 1; 
    } 
    return array_combine(array('r', 'g', 'b', 'a'), $res); 
} 

print_r(parseRGBa('rgba(1, 2, 3, 0.5)')); 

Demo.

+0

Не работает с '$ rgb =" rgb (246, 24, 35) ";'. Я не знаю, начинается ли строка с rgb или rgba. – Chris

+3

Извините, я ожидал, что ваши знания о передаче смогут обрабатывать недостающий код с вашим собственным воображением. – DanFromGermany

+1

@DanFromGermany Очень красивый подход, просто сделал пару настроек в вашем коде.) – raina77ow

1

Другое решение с использованием функции preg_match_all()

$rgba = array("r" => 0, "g" => 0, "b" => 0, "a" => 1); 
$string = "246, 24, 35, 0.8"; // or "rgba(246, 24, 35, 0.8)" 
$i = 0; 

preg_match_all('/[0-9.]+/', $string, $color); 
foreach ($rgba as $key => $value) { 
    $rgba[$key] = $color[0][$i++] ?: 1; 
} 

print_r($rgba); 

Выход:

Array 
(
    [r] => 246 
    [g] => 24 
    [b] => 35 
    [a] => 0.8 
) 

В случае, если у вас есть этот формат

$string = "246, 24, 35"; // or "rgb(246, 24, 35)" 

, как и ожидалось, на выходе будет

Array 
(
    [r] => 246 
    [g] => 24 
    [b] => 35 
    [a] => 1 
) 

Working PHP demo

Смежные вопросы