2012-05-11 4 views
0

У меня есть строка, как это:Regex соответствие несколько строк несколько раз

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); 
+0

Существует \ n, но ваши модификаторы говорят, что каждая новая строка является новой строкой. И. также соответствует \ n –

+0

Я предполагаю, что данные заполнены пользователем. Являются ли данные, поступающие из '$ _POST' или из базы данных? – Biotox

ответ

1

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

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

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

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

0

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

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

Смежные вопросы