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

Исходные данные:
Фамилия: Иванов, Имя: Петр, Отчество: Семенович. ИНН: 6321456871
Всякий текст №1.
Фамилия: Петров, Имя: Семен, Отчество: Иванович. ИНН: 6348962123
Всякий текст №2.

В итоге в массивах это выглядит примерно так:

Array
(
[begin] => Array
(
[0] => Array
(
[0] => Иванов
[1] => Петр
[2] => Семенович
[3] => 6321456871
)

[1] => Array
(
[0] => Петров
[1] => Семен
[2] => Иванович
[3] => 6348962123
)

)

[log] => Array
(
[0] => Фамилия: Иванов, Имя: Петр, Отчество: Семенович. ИНН: 6321456871
[1] => Всякий текст №1.
[2] => Фамилия: Петров, Имя: Семен, Отчество: Иванович. ИНН: 6348962123
[3] => Всякий текст №2.
)

)


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

Мой код:

<?php

if(!empty($_POST['ok']) && !empty($_POST['value1']))
{
$POST['log'][0] = nl2br(htmlspecialchars($_POST['value1'])); // Разбиваем текст на подстроки
$POST['log'] = explode('<br />', $POST['log'][0]); // по символу переноса строки

foreach($POST['log'] as $var => $val) // Проходим по массиву и обрезаем
{ // лишние пробелы в строке
$POST['log'][$var] = trim($val);

if(strpos($POST['log'][$var], 'ИНН') === FALSE); // Если строка содержит
else // обязательное выражение
$POST['begin'][] = $POST['log'][$var]; // то записываем ее в новый массив

}
// Разделяем каждую строку, которая
foreach($POST['begin'] as $var => $val) // содержит обязательное выражение
{ // на несколько фрагментов и помещаем
$i = 0; // в новый массив
$POST['begin'][$var] = explode(', Отчество: ', $val);

$POST['begin'][$var][$i] = explode('Фамилия: ', $POST['begin'][$var][$i]);
$POST['begin'][$var][0] = $POST['begin'][$var][0][1];

$POST['begin'][$var][0] = explode(', Имя: ', $POST['begin'][$var][0]);

$POST['begin'][$var][1] = explode('. ИНН: ', $POST['begin'][$var][1]);

$POST['begin'][$var][2] = $POST['begin'][$var][1][0]; // Перезаписываем полученные данные
$POST['begin'][$var][3] = $POST['begin'][$var][1][1]; // по порядку
$POST['begin'][$var][1] = $POST['begin'][$var][0][1];
$POST['begin'][$var][0] = $POST['begin'][$var][0][0];

$i++;
}

}




Спустя 5 часов, 26 минут, 19 секунд (11.08.2011 - 22:32) walerus написал(а):
что за "обязательные условия" ? я не совсем понял...

Спустя 11 часов, 3 минуты, 31 секунда (12.08.2011 - 09:36) DarkGuard написал(а):
walerus, немного исправил описание и исходные данные, чтобы было понятнее. Обязательное условие - это фильтр, по которому отсеиваются необходимые данные от ненужного текста.

Цитата
Фамилия: Иванов, Имя: Петр, Отчество: Семенович. ИНН: 6321456871
Всякий текст №1.
Фамилия: Петров, Имя: Семен, Отчество: Иванович. ИНН: 6348962123
Всякий текст №2.


Здесь обязательное условие - наличие слова ИНН в строке. Строка "Всякий текст №1." не содержит это слово, поэтому оно не будет отсеяно в новый массив, где с каждой строкой будут производится операции.

Спустя 1 день, 2 часа, 58 минут, 13 секунд (13.08.2011 - 12:34) DarkGuard написал(а):
up (10 символов)

Спустя 40 минут, 21 секунда (13.08.2011 - 13:14) walerus написал(а):
Если все правильно понял, то как то так...

<html>
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</
head>
<
body>
<?php
set_time_limit(0);
error_reporting(E_ALL);

function filter( $input_data, $filter )
{
$explode_input_data = explode( "\r\n", $input_data ); // Разбили на строки входящий текст

// Проверили получился ли массив, если нет возвращаем исходный текст и выдаем ошибку

if ( !is_array( $explode_input_data ) )
{
echo "Не удалось получить данные<br>\n"; flush();
return $input_data;
}

$result = array(); // Результирующий массив найденых данных
$result_log = array(); // Результирующий массив лога работы
foreach( $explode_input_data as $data )
{
// Проверяем условие фильтра
if ( preg_match( '~^.*'.$filter.'.*$~Us', $data ) )
{
// Если найдено
preg_match( '~Фамилия:\s?(.*),\s?Имя:\s?(.*),\s?Отчество:\s?(.*)\.\s?ИНН:\s?(.*)~', trim( $data ), $match);

$result['find'][] = array(
'Фамилия' => trim( $match[1] ),
'Имя' => trim( $match[2] ),
'Отчество' => trim( $match[3] ),
'ИНН' => trim( $match[4] ),
);


$result_log['log'][] = trim( $data );
}
else
$result_log['log'][] = trim( $data ); // Если не найдено
}

return array_merge( $result, $result_log );
}

$text = 'Фамилия: Иванов, Имя: Петр, Отчество: Семенович. ИНН: 6321456871
Всякий текст №1.
Фамилия: Петров, Имя: Семен, Отчество: Иванович. ИНН: 6348962123
Всякий текст №2.'
;

$filter = 'ИНН'; // Фильтр РЕГИСТРОЗАВИСИМЫЙ

$result = filter( $text, $filter );

print_r($result);

?>
</body>
</
html>

Спустя 45 минут, 2 секунды (13.08.2011 - 13:59) DarkGuard написал(а):
walerus, спасибо - буду разбираться! smile.gif
Быстрый ответ:

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