分析ImageMagick直方图颜色字符串并填充关联数组


Parse ImageMagick histogram color string and populate associative array

我在字符串中有ImageMagick直方图颜色信息。我想使用PHP的preg_match()函数解析字符串,但我对正则表达式没有足够的知识。

$str = "588: ( 99, 75, 52) #634B34 srgb(99,75,52)";
preg_match('/(?P<colors>'d+':)/', $str, $matches);
print_r($matches);

预期输出

Array
(
    [colors] => 588,
    [red] => 99,
    [green] => 75,
    [blue] => 52
)

如何获得所需的输出,或者是否有其他方法可以获得颜色和密度?

我想你想要这样的东西,

(?P<colors>'d+):'s*'('s*(?P<red>'d+),'s*(?P<green>'d+),'s*(?P<blue>'d+)

演示

sscanf()是一个非常棒的函数,可以用于此任务,因为:

  1. 它比regex简单简洁
  2. 它允许忽略捕获的数字之前的可选空白
  3. 捕获数被强制转换为整数,而不是像preg_函数返回的字符串,并且
  4. 没有要声明的引用变量;函数返回捕获值的数组

代码:(演示)

$str = "588: ( 99, 75, 52) #634B34 srgb(99,75,52)";
[
    $result['colors'],
    $result['red'],
    $result['green'],
    $result['blue']
] = sscanf($str, '%d: (%d,%d,%d)');
var_export($result);

输出:

array (
  'colors' => 588,
  'red' => 99,
  'green' => 75,
  'blue' => 52,
)

或者,您可以为相同的结果声明函数本身内部的元素。演示

sscanf(
    $str,
    '%d: (%d,%d,%d)',
    $result['colors'],
    $result['red'],
    $result['green'],
    $result['blue']
);

您可以使用此正则表达式来获取srgb:中的值

$str = "588: ( 99, 75, 52) #634B34 srgb(99,75,52)";
preg_match_all("/srgb's*'('s*('d+)'s*,'s*('d+)'s*,'s*('d+)'s*')/i", $str, $matches);
var_dump($matches);

所以如果你的字符串总是这样:

substr($str, 0,3);

将是588