Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: Вывод определенного количества слов
цитата
25/12/11 в 17:47
 Lexikon
сново обращаюсь за помощью, решил сделать вывод части текста. Сначала сделал вывод определенного кол-ва символов, но как то уродско получается.
Решил сделать вывод нескольких слов из строки. Функцию не нашел такую, решил как вариант загнать строку в массив, т.е. разбить текст по словам и выводить несколько элементов из массива. Но это как мне кажется неправильно ибо если текст большой, то уже нагрузка будет. Подскажите как это проще сделать. Спасибо!
цитата
25/12/11 в 17:53
 ibiz
а текст изначально где хранится, в памяти, переменной, файле? trollface.png
цитата
25/12/11 в 18:06
 Yacc
$desc обрезается на границе предложения так, чтобы было не больше 200 символов.

Код:
$desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) );
цитата
25/12/11 в 18:10
 arma
Считай количество пробелов в строке.
При нахождении нужного тебе N-нного пробела отсекай все, что дальше найденной позиции в строке.
цитата
25/12/11 в 18:13
 Lexikon
ibiz писал:
а текст изначально где хранится, в памяти, переменной, файле? trollface.png

текст беру из файла, обрезаю и записываю в новый файл уже с нужным кол-вом слов.
цитата
25/12/11 в 18:15
 ibiz
Yacc писал:
$desc обрезается на границе предложения так, чтобы было не больше 200 символов.

Код:
$desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) );


производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов trollface.png
цитата
25/12/11 в 18:19
 Yacc
ibiz писал:
производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов

Код в студию. icon_smile.gif
цитата
25/12/11 в 18:35
 ibiz
Yacc писал:
Код в студию. icon_smile.gif


думаю стоит начать со чтения части файла, а не целиком:
Код:
<?php
$simb = 200;
$file_txt = fopen("text.txt", "r");
$contents = fread($file_txt, $simb);
fclose($file_txt);
?>


а затем глянуть две очень интересные функции php:
wordwrap и str_word_count, и возможно случится счастье trollface.png
цитата
25/12/11 в 19:32
 Yacc
ibiz писал:
думаю стоит начать со чтения части файла, а не целиком:

А как ты узнаешь сколько байт считывать?


Lexikon: Вот два решения твоей задачи:

Код:
function foo( $text, $word_count ) {
    if( preg_match( '/(\S+\s+){1,'.$word_count.'}/s', $text, $match ) )
        $text = trim( $match[0] );
    return $text;
}

function bar( $text, $word_count ) {
    $words = explode( ' ', $text);
    if( count( $words ) > $word_count )
        $text = join( ' ', array_slice( $words, 0, $word_count ) );
    return $text;
}
цитата
25/12/11 в 19:50
 ibiz
Yacc писал:
А как ты узнаешь сколько байт считывать?


зависит от того сколько слов надо * 15 символов, и убирать последнее слово, т.к. оно может быть неполным trollface.png
цитата
25/12/11 в 19:56
 Yacc
Слова разные бывают, не говоря уже про юникод. icon_smile.gif

Вообщем я тебя понял, за сим откланиваюсь.
цитата
25/12/11 в 22:43
 Lexikon
всем спасибо, но что то так и не понял как это работает.
Цитата:
$desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) );

Тут выводится определенное число символов
---
Цитата:
function foo( $text, $word_count ) {
if( preg_match( '/(\S+\s+){1,'.$word_count.'}/s', $text, $match ) )
$text = trim( $match[0] );
return $text;
}

function bar( $text, $word_count ) {
$words = explode( ' ', $text);
if( count( $words ) > $word_count )
$text = join( ' ', array_slice( $words, 0, $word_count ) );
return $text;
}

в этих случиях, допустим
$text = "text1 text2 text3 text4 text5 text6 text7 text8 text9 text10";
выводится весь текст, как бы я ни крутил icon_neutral.gif
цитата
25/12/11 в 23:02
 Yacc
Lexikon писал:
$desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) );


Тут выводится содержимое $desc, обрезанное на границе предложения, но не длиннее 200 символов.



Lexikon писал:
function foo( $text, $word_count ) {
if( preg_match( '/(\S+\s+){1,'.$word_count.'}/s', $text, $match ) )
$text = trim( $match[0] );
return $text;
}

function bar( $text, $word_count ) {
$words = explode( ' ', $text);
if( count( $words ) > $word_count )
$text = join( ' ', array_slice( $words, 0, $word_count ) );
return $text;
}


Здесь, если

$text = "text1 text2 text3 text4 text5 text6 text7 text8 text9 text10",

то

foo($text,1) == bar($text,1) == 'text1'

foo($text,2) == bar($text,2) == 'text1 text2'

...

foo($text,10) == bar($text,10) == 'text1 text2 text3 text4 text5 text6 text7 text8 text9 text10'
цитата
25/12/11 в 23:21
 ibiz
попробуй так
Код:

function word_count($text,$count){
   while($count){
   $next_word = strpos($text,' ', $next_word+2);
   $count--;
   }
   return substr($text,0,$next_word);
}
цитата
25/12/11 в 23:38
 Yacc
Это вариант как и моя function bar не будут работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.

Поэтому вариант с регуляркой (function foo) самый универсальный, да ещё и самый быстрый (если надо больше, чем 3 слова).
цитата
25/12/11 в 23:54
 Lexikon
вот это сам накарябал

<?php

$text = "text1 text2 text3 text4 text5 text6 text7 text8 text9 text10";
$result = '';
$words = explode(" ", $text);

$i = 0;
while ($i < 5) {

$result .= $words[$i++].' ';

}

echo $result;

?>


тут выводит 5 слов

$result = ''; - если не делать пустую переменную то, выдается ошибка
Notice: Undefined variable: result in

незнаю на сколько верен мой вариант icon_wink.gif

Единственное наверно еще стоит перед занечением в массив избавить строку от лишних пробелов, удалить возможные пробелы в начале и в конце и двойные, а затем уже работать с этой строкой.

Последний раз редактировалось: Lexikon (26/12/11 в 00:22), всего редактировалось 1 раз
цитата
26/12/11 в 00:21
 Yacc
И этот вариант не будет работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.
цитата
26/12/11 в 00:26
 Lexikon


впринципе строки будут заведомо порядка 20 слов без табуляции и переносов, но на всякий случай можно фильтрануть строку на наличие этих разделителей.
цитата
26/12/11 в 07:13
 freeek
ну так ibiz же вроде отличный вариант предложил

1) взять часть текста длинной N
2) посчитать в нем кол-во слов с помощью str_word_count или регулярное выражение
3) убрать последнее слово, так как оно может быть обрезанным
4) из того что осталось выбрать нужно кол-во на вывод
цитата
26/12/11 в 09:33
 Lexikon
Ну вот еще такой вариант
допустим количество символов в поле вывода ограничено (в моем случае это текст над тумбой в DIV), максимально возможное количество символов вместе с пробелами получается 38. Поэтому урезаю строку до 38 символов, считаю количество элементов массива, и удаляю последний, т.к. им может быть обрезанное слово.

<?php

$text = "text1 text2 text3 text4 text5 text6 text7 text8 text9 text10";

$text = preg_replace("/[\r\n\t]/", "", $text ); - этим избавляемся от лишнего

$result = '';
$text = substr($text, 0, 38);
$words = explode(" ", $text);

//$k = str_word_count($text) - 1;

$k = count($words) - 1;
$i = 0;
while ($i < $k) {

$result .= $words[$i++].' ';

}

echo $result;

?>


ну или с использованием
//$k = str_word_count($text) - 1;

Это конечно длинее чем другие предложенные варианты, ну всё же свое icon_rolleyes.gif
цитата
27/12/11 в 11:13
 azh
Код:
function content_cut($str,$maxlen=0,$suffix='...') {
  $str=preg_replace('/\s+/',' ',
      trim(strip_tags(str_replace(
         array('&nbsp;','<li>'),// если надо
         array(' ',' '),
         $str))));
  if ($maxlen && strlen($str)>$maxlen) {
    $str=substr($str,0,$maxlen+1);
    if ($i=strrpos($str,' ')) $str=substr($str,0,$i);
    $str=rtrim($str,'.,;:!?').$suffix;
    }
  return $str;
  }

тут добавил еще раз дополнительную проверку на длину, не помню зачем..... не помню нужна ли она...  smail101.gif
для гуглбэйс титлы обрезались до 70 помоему...
function content_cut($str,$maxlen=0,$suffix='...') {
  $str=preg_replace('/\s+/',' ',
      trim(strip_tags(str_replace(
         array('&nbsp;','<li>'),// если надо
         array(' ',' '),
         $str))));
  if ($maxlen && strlen($str)>$maxlen) {
    $str=substr($str,0,$maxlen+1);
    if (strlen($str)>$maxlen && ($i=strrpos($str,' '))) $str=substr($str,0,$i);
    $str=rtrim($str,'.,;:!?').$suffix;
    }
  return $str;
  }



сначала обрезает до нужного количества символов, а после отсекает после последнего пробела как то так
цитата
27/12/11 в 11:45
 Lexikon
спасибо.
цитата
27/12/11 в 11:57
 azh
ессно если проверка и очистка не нужны, например точно знаешь что база чистая, то можно вырезать это Код:
$str=preg_replace('/\s+/',' ',
      trim(strip_tags(str_replace(
         array('&nbsp;','<li>'),// если надо
         array(' ',' '),
         $str))));

или заменить на
$str=preg_replace('/\s+/',' ',trim($str));

или на
$str=trim($str);

icon_rolleyes.gif

$maxlen нужное количество символов
если окончание не нужно, то $suffix=''


Эта страница в полной версии