Как разобрать текст с ключом по столбцу с возможными многострочными строками

Мне нужно разобрать следующий текст:

First: 1 Second: 2 Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting Fourth: value 

Значение представляет собой строку ИЛИ многострочную строку, в то же время значение может содержать подстроку «key: blablabla». Такое subsctring следует игнорировать (не анализироваться как отдельная пара ключ-значение).

Помогите мне с регулярным выражением или другим алгоритмом.

Идеальный результат:

 $regex = "/SOME REGEX/"; $matches = []; preg_match_all($regex, $html, $matches); // $mathes has all key and value parsed pairs, including multilines values 

Спасибо.

Я пробовал с помощью простых регулярных выражений, но результат неверен, потому что я не знаю, как обращаться с многостроками:

 $regex = "/(.+?): (.+?)/"; $regex = "/(.+?):(.+?)\n/"; ... 

Вы можете сделать это с помощью этого шаблона:

 $pattern = '~(?<key>[^:\s]+): (?<value>(?>[^\n]*\R)*?[^\n]*)(?=\R\S+:|$)~'; preg_match_all($pattern, $txt, $matches, PREG_SET_ORDER); print_r($matches); 

Вы можете сделать это, если вы считаете одно слово, за которым следует двоеточие в начале строки, чтобы начать новый ключ:

 $data = 'First: 1 Second: 2 Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting Fourth: value'; preg_match_all('/^([az]+): (.*?)(?=(^[az]+:|\z))/ims', $data, $matches); var_dump($matches); 

Это дает следующий результат:

 array(4) { [0]=> array(4) { [0]=> string(10) "First: 1 " [1]=> string(11) "Second: 2 " [2]=> string(86) "Multiline: blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting " [3]=> string(13) "Fourth: value" } [1]=> array(4) { [0]=> string(5) "First" [1]=> string(6) "Second" [2]=> string(9) "Multiline" [3]=> string(6) "Fourth" } [2]=> array(4) { [0]=> string(3) "1 " [1]=> string(3) "2 " [2]=> string(75) "blablablabla bla2bla2bla2 bla3b and key: value in the middle if strting " [3]=> string(5) "value" } [3]=> array(4) { [0]=> string(7) "Second:" [1]=> string(10) "Multiline:" [2]=> string(7) "Fourth:" [3]=> string(0) "" } }