Здравствуйте. Нуждаюсь в совете более искушенных 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,' ')); } Как мне узнавать позицию этого пробела??? Спасибо!
дык поискать о_О обычно обрезают чуть больше чем 1000 сиволов, ища первый пробельный символ после этого числа.
дык я очень плохой пхпшник и туплю сегодня жестко... Можно конкретнее, какой функцией искать? Или циклом for перебирать пробелы?...
, ага ну это оно. Но, как реализовать это "чуть больше чем 1000 сиволов"... Мне надо меньше, чтобы оно мне захватило все слово на которое попала отсечка в 1000, с самого начала, т.е. предыдущий пробел. А так оно находит номер первого пробела, после 1000. $probel_n = strpos($str, ' ', 1000); Оно мне даст номер не того пробела. Мне нужен номер перед, а не после. Как это задать?
, а эта фишка мне выдает номер последнего пробела во всем тексте... Добавлено спустя 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, что-то не то
, ну получается, что оно мне в utf-8 обрезает 1000, а strrpos выдает номер последнего пробела в этой 1000, уже в другой кодировке... И как быть?
использовать мультибайтные аналоги! =) http://php.ru/manual/function.mb-strpos.html http://php.ru/manual/function.mb-strrpos.html http://php.ru/manual/function.mb-strcut.html Поздравляю, теперь вы полностью владеете вопросом.
Ну Вы вообще дали единственно-нормальный вектор. Мне там на серче советовали по предложениям или словам отрубать... Алгоритмов мне надавли пунктов под 10... Жесть! А когда я воспротивился - выражали свое великое- "ФЕ" И в целом вели себя высокомерно, в "лучших" традициях общения программеров с ламерами. Ну не понимают, что какие-то единичные затыки - не повод учить php целиком, читать мануалы на английском или еще что-то. Если нет планов двигаться в этом направлении... Спасибо, что вели себя противоположным образом. Спасибо за конкретную помощь! Тему можно закрывать
на серче это где? у сеошников? Добавлено спустя 58 секунд: у тебя с последним куском текста проблем не возникло?
Ну - forum.searchengines.ru там техраздел есть и пару раз там помогали по пхп. Нет, проблем не возникло. А должны были?
я балуюсь всем по-немножку и ничем конкретно - хобби. Пару сайтов для себя и знакомых... Вот иногда какое-нибудь извращение захочется реализовать и приходится лезть в дебри пхп (для меня это уже дебри).
У вас не только php страдает, но и другой язык. 1000 символов ровным счетом ничего не значит. Кроме того в другом месте вы заясняли еще про картинки между строк. Так вот, что вы хотите - называется верстка. И сделать ее как вы хотите - через пару функций с одним параметром 1000 символов - невозможно. Впрочем, подгружайте моноширный шрифт и будет вам щасье в 1000 символов. Добавлено спустя 7 минут 37 секунд: Кому хочется извращений знаете как называется? В старину когда не было винды, висивига и трутайпа - было знакоместо. В точности метафора литеры печатной машинки. Машинка не распознает ширину символа чтобы перевести каретку заданное этой шириной расстояние и поэтому литеры были все одинаковой ширины равной сдвигу каретки при нажатии на клавишу. Такие шрифты существуют до сих пор. Например системный Courier. Он ttf, но моноширный. Однако проблема еще в том, что играет роль интерлиньяж. От так. Или пробел между строками который уже от шрифта не зависит. Собственно и трекинг тоже, поскольку это параметры текста, а не шрифта. Так что вам придется эмпирически извращаться подгоняя свою 1000 под конкретные условия.
А постраничка зависит от ширины. Может быть для вас это не очевидно: ШШШШШШШШШШШШШШШШШШШШ тттттттттттттттттттт по 20 символов в каждой строке. Ундерстенд?
Вы просто повелись на простое решение. На самом деле вот что надо: Вот и поместите свои 1000 знаков в фиксированном диве, "странице". ТС, как сам пишет, свое извращение отпостил на кучу форумов, я видел такое же, но с более подробностями. Так что пусть обломится. Или ставит кварк он-лайн.
Чел, там с версткой все нормально уже, и с обрезкой тоже. Решил для себя проблему ТС, фули троллить то? Андэстенд?