Регулярное выражение с возможными пустыми совпадениями и многострочным совпадением

пыталсяразобрать» некоторые данные с использованием регулярных выражений, и я чувствую, как будто яЯ близко, но я просто могуКажется, это все принесло домой.

Данные, которые необходимо проанализировать, обычно выглядят так:: \n, Количество параметров может варьироваться, так же как и значение. Все еще здесь'Вот пример:

FooID: 123456
Name: Chuck
When: 01/02/2013 01:23:45
InternalID: 789654
User Message: Hello,
this is nillable, but can be quite long. Text can be spread out over many lines
And can start with any number of \n's. It can be empty, too.
What's worse, though is that this CAN contain colons (but they're _"escaped"_ using `\`), and even basic markup!

Чтобы вставить этот текст в объект, я собрал это небольшое выражение

if (preg_match_all('/^([^:\n\\]+):\s*(.+)/m', $this->structuredMessage, $data))
{
    $data = array_combine($data[1], $data[2]);
    //$data is assoc array FooID => 123456, Name => Chuck, ...
    $report = new Report($data);
}

Теперь это работает нормально большую часть времени, за исключениемUser Message немного:. Безразлично»новые строки, потому что если бы я использовалs флаг, вторая группа будет соответствовать всем послеFooID: до самого конца строки.

мне приходится использовать грязный обходной путь для этого:

$msg = explode(end($data[1], $string);
$data[2][count($data[2])-1] = array_pop($msg);

После некоторого тестирования ямы понимаем, что иногда один или два параметра нет заполнены (например,InternalID может быть пустым). В этом случае мое выражение нене терпит, а скорее приводит к: я

    [1] => Array
        (
            [0] => FooID
            [1] => Name
            [2] => When
            [3] => InternalID
        )

    [2] => Array
        (
            [0] => 123465
            [1] => Chuck
            [2] => 01/02/2013 01:23:45
            [3] => User Comment: Hello,
        )

мы пробовали разные выражения и придумали это:

/^([^:\n\\]++)\s{0,}:(.*+)(?!^[^:\n\\]++\s{0,}:)/m
//or:
/^([^:\n\\]+)\s{0,}:(.*)(?!^[^:\\\n]+\s{0,}:)/m

Вторая версия немного медленнее.

Это решает проблемы, которые у меня были сInternalID: , но все же оставляет меня с последним препятствием:User Message: , С использованиемs флаг неТрюк с моим выражением банкомата.

Я могу думать только об этом:

^([^:\n\\]++)\s{0,}:((\n(?![^\n:\\]++\s{0,}:)|.)*+)

Что, на мой взгляд, слишком сложно, чтобы быть единственным вариантом. Идеи, предложения, ссылки, ... все будет с благодарностью

Ответы на вопрос(4)

Ваш ответ на вопрос