Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как большой текст с тегами разбить по страницам?
 
 автор: BlueWolf   (11.09.2010 в 20:04)   письмо автору
 
 

надо большой текст с тегами хранящийся в базе разбить на страницы.
Попробовал сделать вот так:

$sql_select = mysql_query("SELECT * FROM information WHERE id='$id'");
$arr = mysql_fetch_array($sql_select);
$count_str = 1005;
    $count_page = ceil(strlen($arr['text'])/$count_str)-1;
    if (strlen($arr['text']) > $count_str)
    {
        if(!$_GET['str'])
        {
            echo "".substr($arr['text'], 0, $count_str)."";
            echo '<br/><a href="?id='.$id.'&str=1">Далее »</a>';
        }
        else
        {
            echo "".substr($arr['text'], $count_str*$_GET['str'], $count_str)."";
            echo '<br/><a href="?id='.$id.'&str='.($_GET['str']-1).'">Назад</a>';
            if ($_GET['str'] != $count_page)
            echo ' | <a href="?id='.$id.'&str='.($_GET['str']+1).'">Далее</a>';
        }
    }
    else //если небольше, то выводим всю статью на одной страничке...
    {
        echo "$arr[text]";
    }
    
    }
        
while ($arr=mysql_fetch_array($sql_select)); 


Но есть такие проблемы:
1 слова делятся по полам при переходе на новую страницу
2 иногда появляются квадратики &#65533;
Подскажите пожалуйста.

  Ответить  
 
 автор: Trianon   (11.09.2010 в 20:11)   письмо автору
 
   для: BlueWolf   (11.09.2010 в 20:04)
 

а что так крупно нарезали-то?
целых пять сотен символов!
А если не одолеет кто столько за раз?

  Ответить  
 
 автор: BlueWolf   (11.09.2010 в 20:57)   письмо автору
 
   для: Trianon   (11.09.2010 в 20:11)
 

Это для мобильного сайта.

  Ответить  
 
 автор: BlueWolf   (12.09.2010 в 15:37)   письмо автору
 
   для: BlueWolf   (11.09.2010 в 20:04)
 

Проблему с квадратиками решил. Оказывается substr и strlen не правильно работают с utf-8
Поэтому я их заменил на mb_substr и mb_strlen. Теперь квадратиков нет.
Но всё же я не знаю как сделать так чтобы в местах разрыва текста ставился символ "-"
Посоветуйте как сделать лучше?

  Ответить  
 
 автор: Trianon   (12.09.2010 в 15:47)   письмо автору
 
   для: BlueWolf   (12.09.2010 в 15:37)
 

кем ставился?
если скриптом - достаточно просто добавить его в echo .
Неясно лишь - зачем.

  Ответить  
 
 автор: BlueWolf   (12.09.2010 в 17:44)   письмо автору
 
   для: Trianon   (12.09.2010 в 15:47)
 

знак "-" должен ставится в местах переноса слов
Если допустим слово "Слово" в конце страницы заканчивается Сл , а в следуюющей начинается ово. То тут надо ставить чтобы скрипт ставил хотя бы знак "-".
В идиале хотелось бы зделать так чтобы скрипт дописывал всё слово если даже оно выходит за рамки максимального на страницу.

  Ответить  
 
 автор: sl1p   (12.09.2010 в 17:49)   письмо автору
 
   для: BlueWolf   (12.09.2010 в 17:44)
 

ну дык проверяйте на наличие не словесного символа:)

  Ответить  
 
 автор: .....   (12.09.2010 в 18:22)
 
   для: BlueWolf   (12.09.2010 в 17:44)
 

> большой текст с тегами хранящийся в базе
>слова делятся

и это ещё не вылезла проблема с тем что может вывести <h1>
но не вывести </h1>

  Ответить  
 
 автор: sl1p   (12.09.2010 в 18:37)   письмо автору
 
   для: .....   (12.09.2010 в 18:22)
 

+1 лучше делить текст вручную :)

  Ответить  
 
 автор: Лена   (13.09.2010 в 10:42)   письмо автору
1.6 Кб
 
   для: BlueWolf   (12.09.2010 в 17:44)
 

>знак "-" должен ставится в местах переноса слов
>Если допустим слово "Слово" в конце страницы заканчивается Сл , а в следуюющей начинается ово. То тут надо ставить чтобы скрипт ставил хотя бы знак "-".


Посмотрите вот эту тему , я когда-то била текст по словам.
В аттаче - функция, которая проставляет в любом тексте переносы.

  Ответить  
 
 автор: Kioshy   (12.09.2010 в 23:27)
 
   для: BlueWolf   (11.09.2010 в 20:04)
 

самый оптимальный вариант при добавлении в базу в редакторе текста , вставлять в текст разделительный тег, например как в Joomlа {Page Break} , при выводе считать количество разделителей, вытащить текст между разделителями и вывести так как тебе нужно

  Ответить  
 
 автор: Kioshy   (12.09.2010 в 23:30)
 
   для: Kioshy   (12.09.2010 в 23:27)
 

если же делать, просто высчитыванием позиции + обрезание текста, то возьми на вооружение tidy, дабы когда ты обрежешь там где не нужно, разбитые теги не перекрывали все остальное, tidy в этом случае починит за тебя сломанный html

  Ответить  
 
 автор: neadekvat   (13.09.2010 в 00:49)   письмо автору
 
   для: BlueWolf   (11.09.2010 в 20:04)
 

Стааарая-старая функция. Возможно, показывает скорее как делать не надо.
Сначала проверяем, если кол-во символов в тексте меньше допустимого - то просто выкладываем этот текст, если больше - то вызываем функцию. Три аргумента - весь текст, текущая страница (первая - 1, вторая - 2), кол-во символов на одной странице. Возвращает текст текущей страницы.

<?php
Function story_pages($text$page$max)
  {
    
$end_text '';
    
$local_page 1// локальные страницы, для вычислений
    
$array explode('.'$text);
    for (
$i 0$i <= (count($array) - 1); $i++) {
      if (
strlen($end_text) + strlen($array[$i]) <= $max) {
        
$end_text .= $array[$i] . '.';
      } else {
        if (
$local_page == $page) break; 
        ++
$local_page;
        --
$i// не теряем предложения
        
unset ($end_text); // начинаем с чистого листа
      
}
    }
    return 
$end_text;
  }

  Ответить  
 
 автор: Kioshy   (13.09.2010 в 10:12)
 
   для: neadekvat   (13.09.2010 в 00:49)
 

тут вообще подчет символов мало играет роли ибо текст содержит html теги, поэтому оперировать надо функциями strlen, strpos, substr

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования