Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579

Вывод книги (fb2) с постраничной навигацией

28.03.2015, 20:44. Показов 2223. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте. Есть книга с расширением .fb2. Я из неё вытаскиваю содержание (возможно, немного кривым способом, но вроде работает). И использую paginator для раздробления текста на страницы. Код следующий:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//Читаем файл.
$filename = 'MyBook.fb2';
//Создаем XML документ
$doc = new DOMDocument();
//Отключаем проверку ошибок
$doc->strictErrorChecking = false;
$doc->recover = true;
//Загружаем содержимое файла
$load = $doc->load($filename, LIBXML_NOERROR);
$section = $doc->getElementsByTagName('section');
$section = $section->item(0);
 
$stringXML = $doc->saveXML($section);
$limit = 3000;
$paginator = getPaginatorForBooks('index2.php', $stringXML, $limit);
 
echo substr($stringXML, $start, $limit);
echo $paginator;
Функция getPaginatorForBooks

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
function getPaginatorForBooks($targetpage, $book_xml, $limit)
{
    $symbol = '?';
    $total_pages = strlen($book_xml) / $limit;
    
    $stages = 3;
    $page = $_GET['page'];
    
    global $start;
    if($page){
        $start = ($page - 1) * $limit; 
    }else{
        $start = 0; 
    }
    
    // Инициализируем начальные параметры
    if ($page == 0) $page = 1;
    $prev = $page - 1;  
    $next = $page + 1;                          
    $lastpage = ceil($total_pages);     
    $LastPagem1 = $lastpage - 1; // Предпоследняя страница              
        
    $paginate = ''; // div блок, в котором будет содержаться навигация
    
    if($lastpage > 1)
    {   
        $paginate .= "<div class='paginate'>";
        // Формирование ссылки "Предыдущая"
        if ($page > 1){
            $paginate.= "<a href='$targetpage" . $symbol . "page=$prev'>Предыдущая</a>";
        }else{
            $paginate.= "<span class='disabled'>Предыдущая</span>"; }
 
        // Страницы 
        if ($lastpage < 7 + ($stages * 2))  // Недостаточно страниц для создания троеточия
        {   
            for ($counter = 1; $counter <= $lastpage; $counter++)
            {
                if ($counter == $page){
                    $paginate.= "<span class='current'>$counter</span>";
                }else{
                    $paginate.= "<a href='$targetpage" . $symbol . "page=$counter'>$counter</a>";}                  
            }
        }
        elseif($lastpage > 5 + ($stages * 2))   // Достаточно страниц, чтобы скрыть несколько из них
        {
            if($page < 1 + ($stages * 2))       
            {
                for ($counter = 1; $counter < 4 + ($stages * 2); $counter++)
                {
                    if ($counter == $page){
                        $paginate.= "<span class='current'>$counter</span>";
                    }else{
                        $paginate.= "<a href='$targetpage" . $symbol . "page=$counter'>$counter</a>";}                  
                }
                $paginate.= "...";
                $paginate.= "<a href='$targetpage" . $symbol . "page=$LastPagem1'>$LastPagem1</a>";
                $paginate.= "<a href='$targetpage" . $symbol . "page=$lastpage'>$lastpage</a>";     
            }
            elseif($lastpage - ($stages * 2) > $page && $page > ($stages * 2))
            {
                $paginate.= "<a href='$targetpage" . $symbol . "page=1'>1</a>";
                $paginate.= "<a href='$targetpage" . $symbol . "page=2'>2</a>";
                $paginate.= "...";
                for ($counter = $page - $stages; $counter <= $page + $stages; $counter++)
                {
                    if ($counter == $page){
                        $paginate.= "<span class='current'>$counter</span>";
                    }else{
                        $paginate.= "<a href='$targetpage" . $symbol . "page=$counter'>$counter</a>";}                  
                }
                $paginate.= "...";
                $paginate.= "<a href='$targetpage" . $symbol . "page=$LastPagem1'>$LastPagem1</a>";
                $paginate.= "<a href='$targetpage" . $symbol . "page=$lastpage'>$lastpage</a>";     
            }
            else
            {
                $paginate.= "<a href='$targetpage" . $symbol . "page=1'>1</a>";
                $paginate.= "<a href='$targetpage" . $symbol . "page=2'>2</a>";
                $paginate.= "...";
                for ($counter = $lastpage - (2 + ($stages * 2)); $counter <= $lastpage; $counter++)
                {
                    if ($counter == $page){
                        $paginate.= "<span class='current'>$counter</span>";
                    }else{
                        $paginate.= "<a href='$targetpage" . $symbol . "page=$counter'>$counter</a>";}          
                }
            }
        }
                    
        // Формирование ссылки "Следующая"
        if ($page < $counter - 1){ 
            $paginate.= "<a href='$targetpage" . $symbol . "page=$next'>Следующая</a>";
        }else{
            $paginate.= "<span class='disabled'>Следующая</span>";
        }
            
        $paginate.= "</div>";
    }
    return $paginate;
}
Получается примерно результат, показанный на рисунке 1.

Подскажите, как можно модернизировать код, чтобы обрезалось не на символах, а на абзацах (по оканчивающемуся тегу </p>) Пробовал что-то вроде

PHP
1
2
3
4
5
6
7
$limit = 3000;
$result = getPaginatorForBooks('index2.php', $stringXML, $limit);
$currentString = substr($stringXML, $start, $limit);
$last_teg_p = iconv_strrpos($currentString, '</p>');
$currentString = substr($stringXML, $start, $last_teg_p);
echo $currentString;
echo $result;
Но получается ерунда. Нужно как-то лимит динамически сохранять, но не могу разобраться, как.

Добавлено через 4 часа 44 минуты
Может кто помочь?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.03.2015, 20:44
Ответы с готовыми решениями:

Проблемы с постраничной навигацией
Есть код: &lt;? $q = $_GET; $city = $_GET; $num = 5; $page = $_GET;

постраничной навигацией в таблицей
можете ли подсказать как сделать постраничной навигацией в таблицей на php самую простую

Баг с постраничной навигацией
Здравствуйте уважаемые форумчане! Есть код постраничной навигации который работал идеально, но я столкнулся с одной сильной проблемой...

3
 Аватар для Sarrgas
104 / 1 / 0
Регистрация: 20.11.2014
Сообщений: 36
29.03.2015, 09:14
"Получается примерно результат, показанный на рисунке 1."
А я не вижу рисунка...
0
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
29.03.2015, 11:50  [ТС]
Вроде бы вставлял изображение. Еще раз скину
Миниатюры
Вывод книги (fb2) с постраничной навигацией  
0
23 / 23 / 11
Регистрация: 04.12.2012
Сообщений: 579
30.03.2015, 15:14  [ТС]
апну тему

Добавлено через 2 часа 55 минут
Проблему пока не решил(

Добавлено через 15 часов 36 минут
Проблема все еще не решена

Добавлено через 5 часов 5 минут
У кого-нибудь есть варианты решения этой задачи?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
30.03.2015, 15:14
Помогаю со студенческими работами здесь

Продолжение $i++ в таблице с постраничной навигацией
Здравствуйте, у меня возникла проблема в таблице на сайте. Проблема состоит в том, что, код $i++ не продолжает работать в...

Как сделать $i++ в постраничной навигацией
Здравствуйте. У меня возникла проблема с $i++ на сайте, в основном это связано в постраничной навигацией. Суть проблемы: на сайте у...

Как обстоят дела с индексацией статей с постраничной навигацией?
Здравствуйте, у меня такой вопрос. Если использовать, к примеру, на сайте постраничную навигацию статьей то статьи которые будут...

Вывод из двух таблиц с постраничной навигацией
Доброго времени суток Добился вывода информации из двух таблиц &lt;?php // Соединиться с сервером БД include ('conectbd.php'); ...

Новости с постраничной навигацией! Есть статья?
Здравствуйте уважаемые форумчане! Я уже облазил кучу форумов и сайтов, и не нашёл статьи по созданию новостей с постраничной навигацией....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru