Количиство выводимого текста @ DeForum.ru
DeДверь  
Логин:  
Пароль:  
  Автологин  
   
Разместить рекламу
Письмо админу
Правила | FAQ | *Поиск | Наша команда | Регистрация | Вход
 
 
 Страница 1 из 1 [ Сообщений: 15 ] 
*   Список форумов / Начинка и техника / Программирование для WWW » ответить » создать топик « | »
Автор Сообщение
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Заголовок сообщения: Количиство выводимого текста
Сообщение Добавлено: 30 Август 2006, 18:05:20 
Как с помошью PHP можно ограничить количество выводимого текста, но не по количеству букв, а по количеству слов, например из sqlевской базы береться текст в котором скажем 500 слов, а нужно чтобы выводилость только 100. Такое возможно?

_________________
it_systems | rus_photo | rus_design | accentus
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 30 Август 2006, 18:16:19 
Да.
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 18:18:46 
А как эт можно сделать? :lamer:

_________________
it_systems | rus_photo | rus_design | accentus
1NV1Z0R
соучастник
12
Сообщения: 971
Зарегистрирован: 27.09.05
Сообщение Добавлено: 30 Август 2006, 19:00:41 
я не знаю может есть и порокоче встроенные функции, но навскидку:

$words = explode(' ', $text);
$len = strlen($words);
$len = $len > 100 ? 100 : $len;
$words = array_splice($words, $len);
$text = implode(' ', $words);
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 19:45:34 
Спасибо огромное!!!!

_________________
it_systems | rus_photo | rus_design | accentus
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 30 Август 2006, 21:11:07 

is-systems писал(а):
А как эт можно сделать? :lamer:


Для начала нужно определить, что есть слово.

Если "слово есть последовательность непробельных символов, разделенных пробелами", то подходит приведенный выше код.

Если мы говорим об осмысленном тексте, то в число разделителей нужно внести знаки препинания. Соответственно, здесь будет удобно использовать регулярные выражения.

Кроме того, зачастую стоит учитывать крайние случаи. Например -- слова запредельной (более 100 в данном случае) длины.

Есть довольно простой и очевидный однопроходный алгоритм, но ввиду тормознутости PHP-кода по сравнению с его встровенными функциями приведенный выше вариант будет работать быстрее.
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 21:41:19 
Спасибо, но думаю в принципе первый вариант вполне подходит в данном случае, т.к. эт просто необходимо, чтобы на главной страницы сайта не выводился весь текст новостей. а только часть, типа анонс :)

_________________
it_systems | rus_photo | rus_design | accentus
Crazy Муж.
Модератор
107
Сообщения: 14561
Зарегистрирован: 23.12.01
Откуда: Moscow
Сообщение Добавлено: 30 Август 2006, 21:46:43 
Да, сработает достаточно неплохо.
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 21:47:59 
Еще раз спасибо :)

_________________
it_systems | rus_photo | rus_design | accentus
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 30 Август 2006, 22:16:11 
В тексте, где заканчивается анонс, ставишь, на пример <!--break-->, потом ищешь позицию метки в тесте, и выводишь текст по это место. Так как тебе показали, будет обрезать текст, где попало. Можно указать разделители типа </p> <br /> \n . и максимальную длину анонса, резать по разделителю чтоб не ставить break.
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 22:18:37 
В том то и дело, что никаких меток в тексте не будет :)

_________________
it_systems | rus_photo | rus_design | accentus
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 30 Август 2006, 22:22:10 
Ну тогда искать тег, точку, или переход на новую строку который будет после определённого количества символов, тогда тест будет выводиться красиво.
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 30 Август 2006, 22:24:09 
Аха!!! Спасибо! :)

_________________
it_systems | rus_photo | rus_design | accentus
Ainur Муж.
соучастник
16
Сообщения: 731
Зарегистрирован: 15.09.04
Откуда: Italia
Сообщение Добавлено: 30 Август 2006, 22:30:39 
Вот функция Друпала для анонса, при желании её можно использовать.
Код:
/**
 * Automatically generate a teaser for a node body in a given format.
 */
function node_teaser($body, $format = NULL) {

  $size = variable_get('teaser_length', 600);

  // find where the delimiter is in the body
  $delimiter = strpos($body, '<!--break-->');

  // If the size is zero, and there is no delimiter, the entire body is the teaser.
  if ($size == 0 && $delimiter == 0) {
    return $body;
  }

  // We check for the presence of the PHP evaluator filter in the current
  // format. If the body contains PHP code, we do not split it up to prevent
  // parse errors.
  if (isset($format)) {
    $filters = filter_list_format($format);
    if (isset($filters['filter/1']) && strpos($body, '<?') !== false) {
      return $body;
    }
  }

  // If a valid delimiter has been specified, use it to chop of the teaser.
  if ($delimiter > 0) {
    return substr($body, 0, $delimiter);
  }

  // If we have a short body, the entire body is the teaser.
  if (strlen($body) < $size) {
    return $body;
  }

  // In some cases, no delimiter has been specified (e.g. when posting using
  // the Blogger API). In this case, we try to split at paragraph boundaries.
  // When even the first paragraph is too long, we try to split at the end of
  // the next sentence.
  $breakpoints = array('</p>' => 4, '<br />' => 0, '<br>' => 0, "\n" => 0, '. ' => 1, '! ' => 1, '? ' => 1, '。' => 1, '؟ ' => 1);
  foreach ($breakpoints as $point => $charnum) {
    if ($length = strpos($body, $point, $size)) {
      return substr($body, 0, $length + $charnum);
    }
  }

  // If all else fails, we simply truncate the string.
  return truncate_utf8($body, $size);
}
is-systems
соучастник
12
Сообщения: 589
Зарегистрирован: 31.05.06
Откуда: Москва
Сообщение Добавлено: 1 Сентябрь 2006, 09:44:48 
Ainur, Спасибо огромное :)

_________________
it_systems | rus_photo | rus_design | accentus
*   Список форумов / Начинка и техника / Программирование для WWW « | » » ответить » создать топик
 Страница 1 из 1 [ Сообщений: 15 ] 
Показать сообщения за:   Поле сортировки  
Найти:
Перейти:  
Уровень доступа: Вы не можете начинать темы. Вы не можете отвечать на сообщения. Вы не можете редактировать свои сообщения. Вы не можете удалять свои сообщения. Вы не можете добавлять вложения.
cron


ООО ДеФорум
При использовании материалов сайта ссылка на DeForum.ru — обязательна.
Проект Павла Батурина ©2001-2077; // Powered by phpBB © 2013 phpBB Group
Rambler's Top100