I do wonder why the look ahead/behind assertions though. Perhaps I'm missing something?
Perhaps something along the lines of:
$css = '#test { width: 2px + 2 + 3; color:#ffffff; }';
preg_match_all('~:([a-z0-9#\s]+[-*+/][-*+/a-z0-9#\s]+);~', $css, $matches);
$matches[1] = array_map('trim', $matches[1]); // trim off initial / trailing spaces...
echo '<pre>'.print_r($matches[1], true);
?
I use preg_match_all in the even you want all instances of what you seek.
In either case, is that #test line a css expression? If so, they are discouraged.
EDIT - Given that the last css attribute between { and } doesn't have to contain a semi-colon, we could modify the pattern to reflect this:
preg_match_all('~:([a-z0-9#\s]+[-*+/][-*+/a-z0-9#\s]+)(?:;|\R*})~', $css, $matches);