[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Парсинг логов на PHP
crptcrc
Имеются логи в таком формате:

[<timestamp>] <username>: <text>

Необходимо из распарсить и ввести в базу данных.

Здесь есть такие проблемы: во-первых, <text> может занимать несколько строчек (иначе бы было бы просто поделить ввод на строки через preg_split и потом выделить необходимые части через preg_replace). При этом в такой строчке, понятно, могут содержаться процитированные записи лога. Т. е. надо проверять на то, что timestamp в цитате < timestamp'а сообщения, после чего или добавлять строку к предыдущей, меняя \n на что-то еще (если это text) или обрабатывать как новую. Т. е. чтобы в итоге переменная содержала по одному сообщению на строке (чтобы их можно было далее обработать через preg_split и foreach);

Во-вторых, в text могут содержаться особые структуры - цитаты, которые содержатся в text и выглядят как [<timestamp>] <username>: <управляющий элемент> <текст><паттерн>. Их может быть несколько, причем они чередуются с легитимным текстом. Как их вычленить в один массив, а текст -- в другой?

Также, еще вот общий вопрос. Если есть программа, которая исполняется через index.php и не самая большая (20-50 КБ), надо ли выделить все функции в отдельный класс в отдельном файле, а в index.php создать объект и вызывать их через $obj->method(); или оставить все в index.php и вызывать прямо через method(); ? Как правильнее/точнее?



Спустя 3 минуты, 39 секунд (29.09.2011 - 23:24) Игорь_Vasinsky написал(а):
Проект уже реализзован c использованием ООП?
или просто большое желание писать классы?
Можно и на процедурке.

Я не понял,, вам готовые регулярки нужно?



Спустя 34 секунды Игорь_Vasinsky написал(а):
и уместней было бы показать кусок лога

Спустя 3 часа, 37 минут, 56 секунд (30.09.2011 - 03:02) crptcrc написал(а):
Нет, пока он реализован просто через набор functions, не объединенных в классы.

Нет, нужны не регулярки (их-то как раз я бы сам и написал), а скажем так алгоритм, последовательность действий, чтобы корректно обработать код (т. е. например обычный foreach сам по себе не подойдет, т. к. надо хранить данные последней настоящей строки, чтобы при обнаружении псевдостроки добавлять к ней).

Пример лога, который вводится в поле (затрагивает все возможные варианты):

[21.09.2011 12:23:34] user1: text1 // Одна строка
[21.09.2011 13:34:45] user2: text2 // Текст с переносом строки
text2_part2
[21.09.2011 14:12:34] user3: [12:23:34] user1: // Цитата в одном формате
text1text3
[21.09.2011 15:12:12] user2: [20.09.2011 12:11] user4: text4 // Цитаты в другом формате
[20.09.2011 12:12] user4: text4_2

Теперь что должно быть после парсинга в строках:
1. [21.09.2011 12:23:34] user1: text1
2. [21.09.2011 13:34:45] user2: text2 <br /> text2_part2
3. [21.09.2011 14:12:34] user3: [12:23:34] user1: <br /> text1text3
4. [21.09.2011 15:12:12] user2: [20.09.2011 12:11] user4: text4 <br /> [20.09.2011 12:12] user4: text4_2

Определять цитаты можно по тому, что timestamp в них или не имеет даты или его дата меньше, чем дата предыдущей строки (а более новая запись должна иметь позднее время).

Вторая задача: строку, текст которой равен: "[23:11:12] user1: text1.text2
[23:12:22] user2: text3.text4"

Надо поделить на четыре массива: в первый должны войти таймстампы, во второй user1 и user2, в третий text1 и text3, в четвертый text2 и text4.

Спустя 1 день, 12 часов, 52 минуты, 12 секунд (1.10.2011 - 15:54) crptcrc написал(а):
Все-таки решил вопрос, получилось гарантированно распарсить лог, чтобы с новой строчки начиналось только новое реальное сообщение. Теперь надо вот решить такой вопрос:

Есть текст, условно говоря "паттерн1текст1паттерн1текст2". При этом он может быть и "текст1" и "паттерн1текст1".

Надо, чтобы в первый массив были возвращены все включения паттерн1, если есть, иначе false, а во вторую -- все включения текста. И чтоб работало, если паттерн повторяет 3 раза и более ("паттер1текст1паттерн1текст2паттерн1текст3").
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.