Разбор строк в PHP - PullRequest
       6

Разбор строк в PHP

0 голосов
/ 16 февраля 2011

Для моего собственного небольшого проекта я пишу парсер, который анализирует журналы событий определенного приложения. Обычно у меня мало проблем с обработкой таких вещей, но проблема в том, что строки из этих журналов не всегда имеют одинаковые параметры. Например, одна такая строка может быть:

DD/MM HH:MM:SS.MSEC TYPE_OF_EVENT SOURCE, SOURCE_FLAGS, TARGET, TARGET_FLAGS, PARAM1

В другом случае строка может иметь ряд параметров, вплоть до 27, у другого 16. При чтении документации, в параметрах есть некоторая логика, например, 17-й всегда держите целое число Хотя это хорошо, к сожалению, 17-й параметр может быть седьмым в строке. Единственная вещь, которая действительно постоянна в каждой строке, - это отметка времени и шестые первые параметры.

Как бы мне обойти такие строки? Извините, если мой вопрос немного неясен, мне трудно сформулировать мою проблему.

Ответы [ 4 ]

1 голос
/ 16 февраля 2011

Хорошо, следите за моим комментарием вверху.

Если формат журнала "постоянный", основанный на поле TYPE_OF_EVENT, вам просто нужно будет выполнить простой предварительный анализ, после чегоостальные должны легко следовать.

  1. чтение строки
  2. извлечение универсально распространенных полей: отметка времени, тип события, источник / цель
  3. на основе type_of_event, сделайте дальнейший анализ

    switch (event type) {<br> case 'a': parse out 'a' event parameters<br> case 'b': parse out 'b' event parameters<br> default: log unknown event type for future analysis<br> }

и т. д.

1 голос
/ 16 февраля 2011

Это не вход, который может быть "проанализирован" как таковой, потому что нет фиксированных ключевых слов для поиска.Но регулярные выражения кажутся достаточными для извлечения и разделения содержимого.

http://regular -expressions.info / содержит хорошее введение, а https://stackoverflow.com/questions/89718/is-there-anything-like-regexbuddy-in-the-open-source-world перечисляет несколько интересных инструментовкоторая помогает в разработке регулярных выражений.

В вашем случае вам понадобится \d+ для сопоставления десятичных знаков, используйте буквально разделители, и вы, вероятно, можете обойтись без .*?, разделенных запятыми ,, чтобы найтиотдельные части.Может быть:

preg_match('#(\d+/\d+) (\d+:\d+:\d+.\d+) (\w+) (.*?),(.*),(.*),...#');

Если есть переменная длина атрибутов, то вы должны предпочесть два регулярных выражения (хотя это можно сделать в одном).Сначала получите остаток .* каждой строки, а затем разделите его.

1 голос
/ 16 февраля 2011

Я бы использовал другое решение для ведения журнала или нашел бы способ изменить его так, чтобы у вас были пустые заполнители, элемент ,, элемент3 ,,, элемент6 и т. Д.

Только мое мнение, не зная слишком много оэто приложение - это приложение не звучит слишком хорошо.Обычно я оцениваю приложения по таким факторам: если нет веских причин для нестандартизации файла журнала, то как, на ваш взгляд, будет выглядеть остальная часть кода?:)

0 голосов
/ 16 февраля 2011

Как насчет разделения строки разделителем "," и помещения всего в массив. Таким образом, у вас будет числовой индекс, чтобы проверить, существует ли параметр.

...