[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Раздеоение строки по составляющим
Svetlanka_D
Добрый день, ребята. Я не один год занимаюсь программированием на php, но с данной проблемой столкнулась впервые. Имеется текстовый файл созданный программными средствами операционной системы, в нем соответственно находится (относительно) структурированный текст. Его нужно занести в базу данных, но для того чтоб это сделать, нужно его разделить на на строки. Каждая новая строка начинается с даты (Пр.: 04.05.2009) а вот заканчивается по-разному, по-этому мне кажется что делить нужно их как раз по началу строки.
Вся проблема в том, что я решила достичь этой цели при помощи регулярного выражения. Вот его код:

PHP
ereg("([0-9]{2})+\.+([0-9]{2})+\.+([0-9]{4})")


то есть по сути оно ищет вхождение даты и отделяет его

вот весь код:

PHP
$i 0;
$stroka $stroka;
$str_validator "";
while(
$i<strlen($stroka)){

$str_validator $str_validator.$stroka[$i]; 

    if(
$stroka[$i] == "    "){

if(
ereg("([0-9]{2})+\.+([0-9]{2})+\.+([0-9]{4})",$str_validator)){
   echo 
"<div style=\"color:#660099; font-size:17px; font-weight:bolder;\">".substr($stroka,0,$i)."</div>";
   Unset(
$str_validator);

else{
    echo 
substr($stroka,0,$i)."<br/>";
    }
    
$stroka trim(substr($stroka,$i,strlen($stroka)));
    
$i 0;
    Unset(
$str_validator);
    }
$i++;
}







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

Вот отрывок текста из файла:

Цитата

03.10.2009 13:23:10 Security Аудит успехов Использование прав  576 NT AUTHORITY\NETWORK SERVICE USTYUGOVA "Присвоение специальных прав для нового сеанса входа:
  Пользователь: NETWORK SERVICE
  Домен:  NT AUTHORITY
  Код входа: (0x0,0x3E4)
  Привилегии: SeAuditPrivilege
  SeAssignPrimaryTokenPrivilege
  SeChangeNotifyPrivilege"
03.10.2009 13:22:29 Security Аудит успехов Изменение политики  848 NT AUTHORITY\SYSTEM USTYUGOVA "Следующая политика была активна при запуске брандмауэра Windows.

Примененная групповая политика: Нет
Используемый профиль: Обычный
Интерфейс: Все интерфейсы
Рабочий режим: Выкл
Службы
    Общий доступ к файлам и принтерам: Включено
    Удаленный рабочий стол: Включено
    UPnP-инфраструктура: Включено
Разрешать удаленных администраторов: Включено
Разрешать ответы для многоадресного и широковещательного трафика: Отключено
Ведение журнала безопасности:
    Записывать отброшенные пакеты: Отключено
    Записывать успешные подключения: Отключено
ICMP:
    Разрешать запрос входящего эха: Включено
    Разрешать запрос входящего штампа времени: Отключено
    Разрешать запрос входящей маски: Отключено
    Разрешать запрос входящего маршрутизатора: Отключено
    Разрешать сообщение ""Исходящее назначение недоступно"": Отключено
    Разрешать снижение скорости источника исходящих сообщений: Отключено
    Разрешать сообщение ""Проблема исходящего параметра"": Отключено
    Разрешать превышение исходящего времени: Отключено
    Разрешать перенаправление: Отключено
    Разрешать сообщение ""Исходящий пакет слишком велик"": Отключено"








Пожалуйста, если кто-то понимает о чем речь и как это сделать (возможно по-другому) подскажите, буду очень благодарна. Заранее спасибо.



Спустя 36 минут, 35 секунд (8.10.2009 - 17:05) twin написал(а):
А в каком виде нужно записать в базу? Переносы строк сохраняются?

Спустя 16 минут, 8 секунд (8.10.2009 - 17:21) glock18 написал(а):
Как бы так объяснить smile.gif Использовать регулярки не следует при обработке большой строки.

Я бы делал следующим образом.
При решении я опираюсь на:
1. размер даты (длина подстроки с датой) имеет постоянную или максимальную длину (по задаче 19 символов)

Нам для этого нужно:
1. объявить массив для найденных частей. пусть будет $parts = array();
2. текущую часть. $currentPart = '';
3. контрольная строка (та, которая длиной всегда 19 символов)

Алгоритм:
1. Берем первые 19 символов и кладем в контрольную строку.

2. Проверяем контрольную строку на наличие даты. Можно регулярным выражением или например прогонять через strtotime и смотреть отличен ли результат от нуля или нет.

3. В случае, если это дата, то что в данный момент находится в $currentPart кладем в $parts. $currentPart чистим.

4. Далее считываем еще один символ и кладем его в конец контрольной строки, а первый ее символ удаляем из очереди и кладем в $currentPart(на манер очереди). Возвращаемся в пункт 2.

UPD: один нюанс - после удачной проверки на дату, нужно обеспечить несрабатывание проверки на эту же дату после смещения на один или более символов, пока дата еще есть в строке. Для этого можно, допустим, ставить флаг на игнор проверки в течение 19 итераций после совпадения.

Спустя 8 минут, 11 секунд (8.10.2009 - 17:29) twin написал(а):
По моему построчно экономнее, чем посимвольно прогонять. Ну при условии что дата всегда с новой строки идет.

Спустя 2 минуты, 28 секунд (8.10.2009 - 17:32) glock18 написал(а):
Можно и построчно.

Спустя 59 минут, 1 секунда (8.10.2009 - 18:31) Svetlanka_D написал(а):
Большое всем спасибо!!! Сейчас попробую сделать. user posted image

Спустя 2 часа, 43 минуты, 59 секунд (8.10.2009 - 21:15) kalenval написал(а):
Та не за что.
Быстрый ответ:

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