-
Вебмастеру
(
http://forum.oszone.net/forumdisplay.php?f=22)
Как разбить большой кусок текста на несколько частей
Есть несколько распознаных книг загнаных в SQL, 1 книга - одна строка в таблице
как привыводе на сайте сделать постаничное разбиение, наример первые 10 kb страница 1, вторые 10 kb страница 2 и т.д.?
или предложите что-либо другое. Цель одна - из 1 огромной страницы сделать много мелких
|
bruder |
18-05-2008 12:23 805409 |
paginator-ов куча есть. Можно классы найти можно в процедурном стиле. Вот например я недавно отсюда взял, просто mysql запросы на свои поменяй
|
Цитата:
paginator-ов куча есть. Можно классы найти можно в процедурном стиле. Вот например я недавно отсюда взял, просто mysql запросы на свои поменяй
|
По-моему paginator - это не соовсем то, что нужно. Там идет речь о том, что в таблице очень много строк и надо чтобы выводилось, например, по 20 строк таблицы на одну страницу, на следующей - следующие 20 строк таблицы и т.д. + навигатор этих страниц. Здесь же берется всего только одна строка таблицы, которая содержит целую книгу. И эту одну очень длинную строку, содержащую книгу, надо разбить на несколько страниц. Если я правильно понял задачу, то здесь так просто не получится, надо программку писать, которая грамотно разбивает строку на страницы. Я правильно понял автора темы ?
|
Arrest |
21-05-2008 12:26 807607 |
chem1
Смотрим на функцию substr. Предположим, в переменной $text - вся книга.
PHP код:
$max_length = 10000;
if(!isset($page)){
$page = 0;
}
$rettext = substr($text, $page*$max_length, $max_length);
|
vadimiron |
21-05-2008 13:17 807645 |
Цитата:
Цитата Arrest
Смотрим на функцию substr. Предположим, в переменной $text - вся книга. »
|
Лучше наверно вызывать SUBSTR() базы данных. В этом случае не надо всю книгу каждый раз тащить
|
Arrest |
21-05-2008 21:53 808028 |
|
Использовать
Код:
$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);
Здесь программа будет разрывать по пробелам между словами. Хотя и это конечно тоже не предел совершенства.
|
Arrest |
22-05-2008 19:59 808669 |
PHP код:
<?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;
?>
Вот так быстрее, только бы паджинатор еще бы прикрутить....
|
bruder |
23-05-2008 14:44 809205 |
похоже тема всех заинтересовала кроме автора :) Тогда и я внесу свою лепту. Постарался сделать все с помощью mySQL, почти ничего php. Буду рад критике :)
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;
|
Arrest |
23-05-2008 18:20 809368 |
bruder, извращенец :-) проводим полевые испытания? :)
|
bruder |
23-05-2008 18:49 809391 |
:) да, я такой. Если серьезно, то интересно насколько такой код будет производительным с большим объемом текста? Тестировать времени нету. Однако получился очень коротким (если не принимать в расчет огромную sql - сторку). Вообщем как один из вариантов
|
Да здесь собрались сплошные извращенцы. Правильный способ - сделать две таблицы "книга" и "страница", соответственно страница имеет в качестве ключа (id_книги, номер страницы). Показ этого дела тривиален, нужно всего один раз предварительно _приличным_ алгоритмом разбить текст на страницы. Разрыв на пробеле или точке это просто ахтунг. Бить надо по главам (если они размечены и относительно небольшие) или по абзацам (которые в плэйнтекст легко находятся по двум переводам строки, а html по соответствующему тегу). Соответственно на одну страницу помещаем столько абзацев, сколько в лазит в N-кб. Всё.
Но вообще сама идея выдавать книгу в виде 100 мелки страниц тоже критики не выдерживает. Это нужно только, чтобы пользователь пролистал побольше страниц на сайте (читай, больше рекламы посмотрел). И делают так сплошняком только пиратские библиотеки. В общем выражаю своё фи всей затее.
|
Время: 09:24.
© OSzone.net 2001-