Исходные данные:
Фамилия: Иванов, Имя: Петр, Отчество: Семенович. ИНН: 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, спасибо - буду разбираться!