<?php

$re = '/(?:(?!^)\G|({msg))\s+\K(?:\w+|\[[^][]*])(?=[^}]*})/';
$str = 'text {msg ru key} text text {msg key [m=1,p=1]} text {msg ru key [m=la la|p=1]} text';
$results = [];
$tmp = -1;
preg_replace_callback($re, function($m) use (&$results, &$tmp) {
	if (!empty($m[1])) {
		array_push($results, array($m[0]));
		$tmp=$tmp+1;
	} else {
		$results[$tmp][] = $m[0];
	}
}, $str);
print_r($results);