Повторное сопоставление нескольких строк несколько раз

У меня есть строка вроде этого:

Name: John Doe Age: 23 Primary Language: English Description: This is a multiline description field that I want to capture Country: Canada 

Это не фактические данные, но вы можете видеть, что я пытаюсь сделать. Я хочу использовать регулярное выражение для получения массива «ключевых» полей (имя, возраст, основной язык, описание, страна) и их значения.

Я использую PHP.

Моя текущая попытка такова, но она не работает:

 preg_match( '/^(.*?\:) (.*?)(\n.*?\:)/ism', $text, $matches ); 

Related of "Повторное сопоставление нескольких строк несколько раз"

Вот одно из решений: http://rubular.com/r/uDgXcIvhac .

  \s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s* 

Обратите внимание, что я использовал отрицательное утверждение lookahead (?!.*:) . Это единственный способ проверить, что следующая строка не будет выглядеть как новое поле и в то же время продолжит работу, где вы остановились. (Вот почему lookaheads и lookbehind известны как утверждения с нулевой шириной .)

EDIT: удалено бит о просмотрах произвольной ширины; Я ошибался. Вышеупомянутое решение является прекрасным.

Помог ли PHP strtok вам? Вы можете использовать его с «:» в качестве разделителя / токена и обрезать передние и конечные пробелы, чтобы удалить ненужные новые строки.

http://php.net/manual/en/function.strtok.php