$subject = "яблоко красное и [зеленое] яблоко и еще [одно] красное яблоко и [еще] одно яблоко, зеленое";
$pattern = '/\[(.+?)\]/';
preg_match_all($pattern, substr($subject,3), $matches);
print_r($matches);
Во-первых, вам нужно использовать ленивый квантификатор - добавить знак вопроса после ".+". Таким образом поиск будет производится до первого совпадения, а не до последнего.
Во-вторых, нужно использовать preg_match_all, если вам нужны все совпадения.