Показать полную графическую версию : Как разбить большой кусок текста на несколько частей
Есть несколько распознаных книг загнаных в SQL, 1 книга - одна строка в таблице
как привыводе на сайте сделать постаничное разбиение, наример первые 10 kb страница 1, вторые 10 kb страница 2 и т.д.?
или предложите что-либо другое. Цель одна - из 1 огромной страницы сделать много мелких
paginator-ов куча есть. Можно классы найти можно в процедурном стиле. Вот например я недавно отсюда (http://www.tonymarston.net/php-mysql/pagination.html) взял, просто mysql запросы на свои поменяй
paginator-ов куча есть. Можно классы найти можно в процедурном стиле. Вот например я недавно отсюда взял, просто mysql запросы на свои поменяй По-моему paginator - это не соовсем то, что нужно. Там идет речь о том, что в таблице очень много строк и надо чтобы выводилось, например, по 20 строк таблицы на одну страницу, на следующей - следующие 20 строк таблицы и т.д. + навигатор этих страниц. Здесь же берется всего только одна строка таблицы, которая содержит целую книгу. И эту одну очень длинную строку, содержащую книгу, надо разбить на несколько страниц. Если я правильно понял задачу, то здесь так просто не получится, надо программку писать, которая грамотно разбивает строку на страницы. Я правильно понял автора темы ?
chem1
Смотрим на функцию substr (http://php.net/substr). Предположим, в переменной $text - вся книга.
$max_length = 10000;
if(!isset($page)){
$page = 0;
}
$rettext = substr($text, $page*$max_length, $max_length);
vadimiron
21-05-2008, 13:17
Смотрим на функцию substr. Предположим, в переменной $text - вся книга. »
Лучше наверно вызывать SUBSTR() базы данных. В этом случае не надо всю книгу каждый раз тащить
vadimiron
Да, так действительно удобнее :-)
http://www.1keydata.com/sql/sql-substring.html
Использовать $rettext = substr($text, $page*$max_length, $max_length); - не эффективно, т.к. программа будет разрывать на страницы где попало, посреди слов и т.д., может одну букву остваить на одной странице, а остальную часть слова перенести на другую или наоборт, перенесет последнюю букву на следующу страницу. Словом, будет рвать слова и предложения где вздумается. Можно попробовать такой вариант:
$text = 'Первый пример текста. Второй пример текста. Третий пример текста. Четвертый пример текста.';
$max_length = 30;
$page = (isset($_GET['page']) ? $_GET['page'] : 2);
// Разбиваем $text на массив $arr[], находя в тексте пробелы между словами
$text.= ' ';
while (!empty($text)):
if (strlen($text)>$max_length) $n = $max_length; else $n = strlen($text);
for ($i = $n-1; $i>0; $i--) if ($text[$i]==' ') break;
$arr[] = trim(substr($text,0,$i+1)); $text = substr($text,$i+1);
endwhile;
$k = count($arr);
// Выводим на экран текущую страницу
echo 'Страница '.$page.' из '.$k.'<br><br>';
echo $arr[$page-1];
// Теперь рисуем простенький навигатор страниц
$nav = '<a href="?page='.($page>1 ? $page-1 : 1).'">Предыдущая</a> ';
$nav.= '<a href="?page='.($page<$k ? $page+1 : $k).'">Следующая</a>';
echo '<br><br>'.$nav;
// А это для отладки, чтобы было видно, что происходит
echo '<pre>'; print_r($arr);
Здесь программа будет разрывать по пробелам между словами. Хотя и это конечно тоже не предел совершенства.
<?php
$maxlen = 10;
$page = isset($_GET['page'])?$_GET['page']:1;
$page_beginning = $maxlen * $page;
$page_end = $page_beginning + $maxlen + 50;
mysql_connect(...);
$q = mysql_fetch_assoc(mysql_query("SELECT SUBSTR(text, $page_beginning, $page_end) AS txt FROM books WHERE id = 1;");
$page_text = $q['txt'];
$page_length = $page_end - $page_beginning;
$char = $page_text[$page_length-1];
$cut_length = $page_length - 1;
while($char!=" " && ($cut_length - $page_len) != 50){
$length += 1;
$char = $page_text[$length];
}
$dsp_text = substr($page_text, $page_beginning, $cut_length);
echo $dsp_text;
?>
Вот так быстрее, только бы паджинатор еще бы прикрутить....
похоже тема всех заинтересовала кроме автора :) Тогда и я внесу свою лепту. Постарался сделать все с помощью mySQL, почти ничего php. Буду рад критике :)
$page = (is_numeric($_GET['page']) ? $_GET['page'] : 1);
$pro_page = 100;
$link = mysql_connect('localhost', 'root', '');
mysql_select_db ('test', $link);
$pos = ($page>1)?$page * $pro_page:1;
$sql = "select
LOCATE(' ', trim(b.text), ".$pos."+".$pro_page."),
if(
LOCATE(' ', trim(b.text), ".$pos."+".$pro_page."),
SUBSTRING(trim(b.text),".$pos.",(LOCATE(' ', b.text, ".$pos."+".$pro_page.")-".$pos.")),
SUBSTRING(trim(b.text),".$pos.", LENGTH(b.text) - ".$pro_page.")
) as my from book b";
$result = mysql_query ($sql);
$row = mysql_fetch_row($result);
$pagination = ($page>1)?'<a href="1.php?page='.($page-1).'">< </a> ':'';
$pagination .= ($row[0]>0)?'<a href="1.php?page='.($page+1).'> ></a>':'';
echo $row[1];
echo '<br/>';
echo $pagination;
bruder, извращенец :-) проводим полевые испытания? :)
bruder, извращенец »
:) да, я такой. Если серьезно, то интересно насколько такой код будет производительным с большим объемом текста? Тестировать времени нету. Однако получился очень коротким (если не принимать в расчет огромную sql - сторку). Вообщем как один из вариантов
Да здесь собрались сплошные извращенцы. Правильный способ - сделать две таблицы "книга" и "страница", соответственно страница имеет в качестве ключа (id_книги, номер страницы). Показ этого дела тривиален, нужно всего один раз предварительно _приличным_ алгоритмом разбить текст на страницы. Разрыв на пробеле или точке это просто ахтунг. Бить надо по главам (если они размечены и относительно небольшие) или по абзацам (которые в плэйнтекст легко находятся по двум переводам строки, а html по соответствующему тегу). Соответственно на одну страницу помещаем столько абзацев, сколько в лазит в N-кб. Всё.
Но вообще сама идея выдавать книгу в виде 100 мелки страниц тоже критики не выдерживает. Это нужно только, чтобы пользователь пролистал побольше страниц на сайте (читай, больше рекламы посмотрел). И делают так сплошняком только пиратские библиотеки. В общем выражаю своё фи всей затее.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.