[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Прошу помощи, парсинг простого текста
greenfoxx
Привет коллеги. Столкнулся с интересной задачей парсинга текста из базы данных.
Вот полный текст записи(переносы сохранены - в sql файле это '\r\n'):

###SECTION_1###1###3###TITLE_BLOCK_1
text_1
text_2
text_3
###SECTION_2###2###2###TITLE_BLOCK_2
column_1###column_2
text_1###120
text_2###130

А вот как в итоге должно быть после парсинга и вывода:

TITLE_BLOCK_1
text_1
text_2
text_3

TITLE_BLOCK_2
+----------+----------+
| column_1 | column_2 |
+----------+----------+
| text_1 | 120 |
| text_2 | 130 |
+----------+----------+


Понимаю, что конечный результат можно уже вывести с помощью php. Но вот как распарсить такой текст пока что затрудняюсь.
В задаче нужно задействовать класс(желательно) или функцию без использования каких-то фреймворков.
1. Текст, название блоков, название колонок может быть разный и сколько угодно.
2. Расположение секций может быть следовать по разному(друг за другом или разбросано) НО название их одинаковое везде во всех записях базы.
Тоесть, например SECTION_1 = Links, а SECTION_2 = Hotels

Назначение цифр пока что мне не понятно, можно пропустить их.

Подскажите плз как это можно сделать? с чего нуно начать?
Считывать построчно в функции или как то все таки проще заюзать класс?



Спустя 2 часа, 3 минуты, 43 секунды (14.05.2012 - 21:50) sergeiss написал(а):
Цитата (greenfoxx @ 14.05.2012 - 19:46)
Подскажите плз как это можно сделать? с чего нуно начать?

Начать нужно с того, что понять алгоритм :) Каким образом ты его потом реализуешь, это уже "дело десятое". Самое главное в том, что алгоритм должен быть правильным. Ты САМ опиши алгоритм, а мы тебе подскажем, как это на ПХП реализовать (какие функции и т.д.).

Вот берешь ты первую строку
###SECTION_1###1###3###TITLE_BLOCK_1

по какому признаку ты выделишь нужную часть?

И так далее, по каждой строке: по каким признакам выделяется нужная тебе часть данных?


Далее.
Цитата (greenfoxx @ 14.05.2012 - 19:46)

Считывать построчно в функции или как то все таки проще заюзать класс?

Ты сам-то понял, что хотел спросить в этом вопросе?

Спустя 36 минут, 37 секунд (14.05.2012 - 22:27) XCross написал(а):
Да просто студенту лень читать, он решил, что мы тут за него напишем все.

Спустя 13 минут, 56 секунд (14.05.2012 - 22:41) greenfoxx написал(а):
Ну во первых не студент. А во вторых я не прошу за меня писать код, а только теоретически спрашиваю с чего начать.

А вот реальным студентам можно было и промолчать и не показывать тут свое остроумие.

Спустя 17 минут, 29 секунд (14.05.2012 - 22:58) sergeiss написал(а):
Цитата (greenfoxx @ 14.05.2012 - 22:41)
А во вторых я не прошу за меня писать код, а только теоретически спрашиваю с чего начать.

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

XCross - ты не прав. В первую очередь по форме высказывания. А еще потому, что это был флуд в тематическом разделе, нарушение п.2.2 Правил Форума. Для начала - устное предупреждение.

Спустя 55 минут, 23 секунды (14.05.2012 - 23:53) Игорь_Vasinsky написал(а):
во вторых - это дубль темы. оригинал в PHP для начинающих. и там почему то ТС всё знает и у него задача написать класс для парсинга этого текста.

Спустя 4 минуты, 49 секунд (14.05.2012 - 23:58) greenfoxx написал(а):
Да, сори за дубль. пока что не скумекаю как на классы переделать можно. в ООП не силен пока что. плиз хелп

Спустя 5 минут, 18 секунд (15.05.2012 - 00:04) Игорь_Vasinsky написал(а):
ты уверен что тебе именно ООП нужен? может процедурным обойтись?

Спустя 12 минут, 39 секунд (15.05.2012 - 00:16) greenfoxx написал(а):
процедурный у меня уже почти реализован. интересен вариант на ООП

Спустя 5 минут, 29 секунд (15.05.2012 - 00:22) Игорь_Vasinsky написал(а):
ну чтож. потихоньку дели на функции по этапам, определяй аргументы.

потом в класс..или классы.

Спустя 5 часов, 22 минуты, 26 секунд (15.05.2012 - 05:44) olgatcpip написал(а):
Цитата
процедурный у меня уже почти реализован. интересен вариант на ООП

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

Чуешь к чему я? Не скрывай решения. Показывай и все

Спустя 2 часа, 46 минут, 44 секунды (15.05.2012 - 08:31) Игорь_Vasinsky написал(а):
за одно и может оптимизируем вместе.

Спустя 4 часа, 28 минут, 1 секунда (15.05.2012 - 12:59) greenfoxx написал(а):
Да, вот процедурное решение, которое в массиве все хранит. дальше в принципе дальше могу сам уже из массива выбрать. Нуно на ООП перевести.


global $array;
$array = array('#SECTION_1#', '#SECTION_2#', '#SECTION_3#', '#SECTION_4#');
$result = parse($a);
print_r($result);


function parse($a) {
global $array;
$a = explode("\r\n", $a);
$i = 0;
$sec = 0;
foreach ($a as $val) {
foreach ($array as $item) {
if (strpos($val, $item) !== false) {
$i = 0;
$sec++;
$inf = explode("###", $val);
$out[$sec] = array(
"section" => $inf[1],
"cols" => $inf[2],
"rows" => $inf[3],
"title" => $inf[4]
);

continue;
}
}

$out[$sec]["table"][$i] = explode("###", $val);
$i++;

}
return $out;
}


Тут важный момент:
2. Расположение секций может быть следовать по разному(друг за другом или разбросано) НО название их одинаковое везде во всех записях базы. Но уже вывод данных идет строго в определенной последовательности.
Поэтому я сразу эту последовательность в массиве задал:


$array = array('#SECTION_1#', '#SECTION_2#', '#SECTION_3#', '#SECTION_4#');
Быстрый ответ:

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