Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Вебмастеру (http://forum.oszone.net/forumdisplay.php?f=22)
-   -   Как разбить большой кусок текста на несколько частей (http://forum.oszone.net/showthread.php?t=107236)

chem1 18-05-2008 11:36 805377

Как разбить большой кусок текста на несколько частей
 
Есть несколько распознаных книг загнаных в SQL, 1 книга - одна строка в таблице
как привыводе на сайте сделать постаничное разбиение, наример первые 10 kb страница 1, вторые 10 kb страница 2 и т.д.?
или предложите что-либо другое. Цель одна - из 1 огромной страницы сделать много мелких

bruder 18-05-2008 12:23 805409

paginator-ов куча есть. Можно классы найти можно в процедурном стиле. Вот например я недавно отсюда взял, просто mysql запросы на свои поменяй

chirs 21-05-2008 11:39 807556

Цитата:

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

vadimiron
Да, так действительно удобнее :-)
http://www.1keydata.com/sql/sql-substring.html

chirs 22-05-2008 18:12 808581

Использовать
Код:

$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>&nbsp;';
$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

Цитата:

Цитата Arrest
bruder, извращенец »

:) да, я такой. Если серьезно, то интересно насколько такой код будет производительным с большим объемом текста? Тестировать времени нету. Однако получился очень коротким (если не принимать в расчет огромную sql - сторку). Вообщем как один из вариантов

ivank 25-05-2008 16:32 810394

Да здесь собрались сплошные извращенцы. Правильный способ - сделать две таблицы "книга" и "страница", соответственно страница имеет в качестве ключа (id_книги, номер страницы). Показ этого дела тривиален, нужно всего один раз предварительно _приличным_ алгоритмом разбить текст на страницы. Разрыв на пробеле или точке это просто ахтунг. Бить надо по главам (если они размечены и относительно небольшие) или по абзацам (которые в плэйнтекст легко находятся по двум переводам строки, а html по соответствующему тегу). Соответственно на одну страницу помещаем столько абзацев, сколько в лазит в N-кб. Всё.

Но вообще сама идея выдавать книгу в виде 100 мелки страниц тоже критики не выдерживает. Это нужно только, чтобы пользователь пролистал побольше страниц на сайте (читай, больше рекламы посмотрел). И делают так сплошняком только пиратские библиотеки. В общем выражаю своё фи всей затее.


Время: 09:24.

Время: 09:24.
© OSzone.net 2001-