preg_replace('/\[.*?:(.*?)\]/', '$1', $str);
CodePad .
Если вы хотите захватить текст перед двоеточием, просто заключите его в скобки, и он станет группой захвата 1.
Обновление
Я хочу использовать preg_match
вместо preg_replace
Вы хотите использовать preg_match_all()
, чтобы получить все совпадения.
preg_match_all('/\[(.*?):(.*?)\]/', $str, $matches);
Ideone .
В качестве альтернативы, вы можете дать им именованные группы захвата.
preg_match_all('/\[(?P<identifier>.*?):(?<body>.*?)\]/', $str, $matches);
Ideone .