За последние 24 часа нас посетили 18329 программистов и 1597 роботов. Сейчас ищут 813 программистов ...

Корректная разбивка текста на блоки

Тема в разделе "Прочие вопросы по PHP", создана пользователем mayor-ua, 30 окт 2013.

  1. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    Здравствуйте. Нуждаюсь в совете более искушенных php-шников.

    Ситуация. Есть некий текст неизвестной длины.
    Надо разбивать текст на блоки. Чтобы каждый блок помещался в фиксированном div, страницах книги.
    Сначала: в левом листе книги - меню, в правом - первый блок текста. Если текст не влазит - нажимаю далее. Аяксом гружу в левый лист второй блок, если и его мало - то в правый лист - третий блок и т.д.
    Допустим, 1000 знаков utf-8 влазят в блок.

    Код:

    $text = strip_tags ($text);
    $strlength = mb_strlen($text,'UTF-8');

    function obrez($str, $limit)
    {
    $str = mb_substr($str,0,$limit+1,'UTF-8');
    return substr($str,0,strrpos($str,' '));
    }

    $text_prev = obrez($text, 1000);

    Тут все хорошо. Я обрезал первую часть текста до пробела, чтобы не резать слово...

    Дальше - хуже.
    Я пытаюсь обрезать второй (энный) блок. Но тут, если я режу от 1000-ого знака, начало - произвольная буква. Мне нужно, чтобо обрезало от начала слова. Грубо говоря: стартом mb_substr должен быть не 1000, а позиция пробела - первого перед 1000.

    function obrez2($str, $limit)
    {
    $str = mb_substr($str,1000,$limit+1,'UTF-8');
    return substr($str,0,strrpos($str,' '));
    }

    Как мне узнавать позицию этого пробела???
    Спасибо!
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    дык поискать о_О

    обычно обрезают чуть больше чем 1000 сиволов, ища первый пробельный символ после этого числа.
     
  3. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    дык я очень плохой пхпшник и туплю сегодня жестко... Можно конкретнее, какой функцией искать?
    Или циклом for перебирать пробелы?...
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  5. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    , ага ну это оно.
    Но, как реализовать это "чуть больше чем 1000 сиволов"...
    Мне надо меньше, чтобы оно мне захватило все слово на которое попала отсечка в 1000, с самого начала, т.е. предыдущий пробел. А так оно находит номер первого пробела, после 1000.

    $probel_n = strpos($str, ' ', 1000);
    Оно мне даст номер не того пробела. Мне нужен номер перед, а не после. Как это задать?
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  7. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    , а эта фишка мне выдает номер последнего пробела во всем тексте...

    Добавлено спустя 20 минут:
    тут или какой-то прикол с utf-8 кроется... или я не пойму.

    Код:

    Отрубаю первый кусок текста:

    function obrez($str, $limit)
    {
    $str = mb_substr($str,0,$limit+1,'UTF-8');
    return substr($str,0,strrpos($str,' '));
    }

    $text_prev = obrez($text, 1000);

    Нахожу номер последнего пробела в нем $lp = strrpos($text_prev,' '); и оно мне выдает 1965...
    Как может в тексте длиной 1000, быть последний пробел на позиции 1965, что-то не то
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    utf-8 - мультибайтная кодировка.
     
  9. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    , ну получается, что оно мне в utf-8 обрезает 1000, а strrpos выдает номер последнего пробела в этой 1000, уже в другой кодировке... И как быть?
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  11. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    боюсь... вы правы :D

    Все работатет!!!

    Выручили ламера! Большое спасибо! :)
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Не за что.

    UTF-8 правильный путь. Еще иногда используют UTF-16.
     
  13. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    Ну Вы вообще дали единственно-нормальный вектор. Мне там на серче советовали по предложениям или словам отрубать... Алгоритмов мне надавли пунктов под 10... Жесть!
    А когда я воспротивился - выражали свое великое- "ФЕ" :)
    И в целом вели себя высокомерно, в "лучших" традициях общения программеров с ламерами.
    Ну не понимают, что какие-то единичные затыки - не повод учить php целиком, читать мануалы на английском или еще что-то. Если нет планов двигаться в этом направлении...

    Спасибо, что вели себя противоположным образом.
    Спасибо за конкретную помощь! :)

    Тему можно закрывать
     
  14. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    на серче это где? у сеошников?

    Добавлено спустя 58 секунд:
    у тебя с последним куском текста проблем не возникло?
     
  15. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    Ну - forum.searchengines.ru там техраздел есть и пару раз там помогали по пхп.

    Нет, проблем не возникло. А должны были? :)
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Ну если ты его тоже прогонишь через обрезку то будут. А ты сеошник? Автоматизируешь?
     
  17. mayor-ua

    mayor-ua Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    9
    Симпатии:
    0
    я балуюсь всем по-немножку и ничем конкретно - хобби. Пару сайтов для себя и знакомых... Вот иногда какое-нибудь извращение захочется реализовать и приходится лезть в дебри пхп (для меня это уже дебри).
     
  18. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    У вас не только php страдает, но и другой язык.

    1000 символов ровным счетом ничего не значит. Кроме того в другом месте вы заясняли еще про картинки между строк. Так вот, что вы хотите - называется верстка. И сделать ее как вы хотите - через пару функций с одним параметром 1000 символов - невозможно.

    Впрочем, подгружайте моноширный шрифт и будет вам щасье в 1000 символов.

    Добавлено спустя 7 минут 37 секунд:
    Кому хочется извращений знаете как называется?

    В старину когда не было винды, висивига и трутайпа - было знакоместо. В точности метафора литеры печатной машинки. Машинка не распознает ширину символа чтобы перевести каретку заданное этой шириной расстояние и поэтому литеры были все одинаковой ширины равной сдвигу каретки при нажатии на клавишу.

    Такие шрифты существуют до сих пор. Например системный Courier. Он ttf, но моноширный. Однако проблема еще в том, что играет роль интерлиньяж. От так. Или пробел между строками который уже от шрифта не зависит. Собственно и трекинг тоже, поскольку это параметры текста, а не шрифта.

    Так что вам придется эмпирически извращаться подгоняя свою 1000 под конкретные условия.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    он не ширину хочет, а постраничку
     
  20. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    А постраничка зависит от ширины. Может быть для вас это не очевидно:

    ШШШШШШШШШШШШШШШШШШШШ
    тттттттттттттттттттт

    по 20 символов в каждой строке. Ундерстенд?
     
  21. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. =) какая разница? тут вообще нет речи о том, какая у него на сайте верстка.
     
  22. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Вы просто повелись на простое решение. На самом деле вот что надо:

    Вот и поместите свои 1000 знаков в фиксированном диве, "странице". ТС, как сам пишет, свое извращение отпостил на кучу форумов, я видел такое же, но с более подробностями.

    Так что пусть обломится. Или ставит кварк он-лайн.
     
  23. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    на первый раз предупреждение.
     
  24. deblogger

    deblogger Новичок

    С нами с:
    11 июл 2013
    Сообщения:
    200
    Симпатии:
    0
    Охуеть!
     
  25. Dmitriy427

    Dmitriy427 Новичок

    С нами с:
    30 окт 2013
    Сообщения:
    53
    Симпатии:
    0
    Чел, там с версткой все нормально уже, и с обрезкой тоже. Решил для себя проблему ТС, фули троллить то? Андэстенд?