У меня есть строка вроде этого:
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 );
Вот одно из решений: http://rubular.com/r/uDgXcIvhac .
\s*([^:]+?)\s*:\s*(.*(?:\s*(?!.*:).*)*)\s*
Обратите внимание, что я использовал отрицательное утверждение lookahead (?!.*:)
. Это единственный способ проверить, что следующая строка не будет выглядеть как новое поле и в то же время продолжит работу, где вы остановились. (Вот почему lookaheads и lookbehind известны как утверждения с нулевой шириной .)
EDIT: удалено бит о просмотрах произвольной ширины; Я ошибался. Вышеупомянутое решение является прекрасным.
Помог ли PHP strtok вам? Вы можете использовать его с «:» в качестве разделителя / токена и обрезать передние и конечные пробелы, чтобы удалить ненужные новые строки.