Мой ответ не только извлечет значения подстроки, которые вы хотите, но и дополнительно обеспечит достаточно высокий уровень проверки (а не 100% -ную проверку). Я изменил шаблон с https://stackoverflow.com/a/31245990/2943403, чтобы более точно ответить на этот вопрос. Надеюсь, вы найдете этот ответ точным, элегантным и прямым.
Если вы хотите сократить / упростить шаблон, это будет делать: ( Regex101 Demo )
~^rgba?\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*(?:,\s*([.\d]+))?\)$~
Код: ( Демо w / $ include_alpha = true ) ( Демо w / $ include_alpha = false ) ( Regex101 Демо )
function rgb_array($color, $include_alpha = true) {
$pattern = '~^rgba?\((25[0-5]|2[0-4]\d|1\d{2}|\d\d?)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|\d\d?)\s*,\s*(25[0-5]|2[0-4]\d|1\d{2}|\d\d?)\s*(?:,\s*([01]\.?\d*?))?\)$~';
if (!preg_match($pattern, $color, $matches)) {
return []; // disqualified / no match
}
return array_slice($matches, 1, $include_alpha ? 4 : 3);
}
$strings = [
'rgb(0,0,0)',
'rgb(00,00,00)',
'rgb(0, 0, 0)',
'donkey eggs',
'rgb(00, 00, 00)',
'rgba(0,0,0,0.5)',
'rgba(255, 255, 255, 1)'
];
foreach ($strings as $string) {
echo "Process: $string\n";
var_export(rgb_array($string));
echo "\n";
}
Выход:
Process: rgb(0,0,0)
array (
0 => '0',
1 => '0',
2 => '0',
)
Process: rgb(00,00,00)
array (
0 => '00',
1 => '00',
2 => '00',
)
Process: rgb(0, 0, 0)
array (
0 => '0',
1 => '0',
2 => '0',
)
Process: donkey eggs
array (
)
Process: rgb(00, 00, 00)
array (
0 => '00',
1 => '00',
2 => '00',
)
Process: rgba(0,0,0,0.5)
array (
0 => '0',
1 => '0',
2 => '0',
3 => '0.5',
)
Process: rgba(255, 255, 255, 1)
array (
0 => '255',
1 => '255',
2 => '255',
3 => '1',
)
p.s. Если вы хотите использовать preg_split()
, вы можете быть гораздо менее точным в отношении своего паттерна. Вот вам одна строчка ( Демо )
function rgb_array($color, $include_alpha = true) {
return array_slice(preg_split('~[^\d.]+~', $color, -1, PREG_SPLIT_NO_EMPTY), 0, $include_alpha + 3);
}