Реклама на сайте Advertise with us

Вывод определенного количества слов

Расширенный поиск по форуму
 
Новая тема Новая тема   
Автор
Поиск в теме:

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 25/12/11 в 17:47       Ответить с цитатойцитата 

сново обращаюсь за помощью, решил сделать вывод части текста. Сначала сделал вывод определенного кол-ва символов, но как то уродско получается.
Решил сделать вывод нескольких слов из строки. Функцию не нашел такую, решил как вариант загнать строку в массив, т.е. разбить текст по словам и выводить несколько элементов из массива. Но это как мне кажется неправильно ибо если текст большой, то уже нагрузка будет. Подскажите как это проще сделать. Спасибо!

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 25/12/11 в 17:53       Ответить с цитатойцитата 

а текст изначально где хранится, в памяти, переменной, файле? trollface.png

6
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 18:06       Ответить с цитатойцитата 

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

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

6
 



С нами с 16.07.06
Сообщения: 886
Рейтинг: 892

Ссылка на сообщениеДобавлено: 25/12/11 в 18:10       Ответить с цитатойцитата 

Считай количество пробелов в строке.
При нахождении нужного тебе N-нного пробела отсекай все, что дальше найденной позиции в строке.

6
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 25/12/11 в 18:13       Ответить с цитатойцитата 

ibiz писал:
а текст изначально где хранится, в памяти, переменной, файле? trollface.png

текст беру из файла, обрезаю и записываю в новый файл уже с нужным кол-вом слов.

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 25/12/11 в 18:15       Ответить с цитатойцитата 

Yacc писал:
$desc обрезается на границе предложения так, чтобы было не больше 200 символов.

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


производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов trollface.png

6
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 18:19       Ответить с цитатойцитата 

ibiz писал:
производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов

Код в студию. icon_smile.gif

6
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 25/12/11 в 18:35       Ответить с цитатойцитата 

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

7
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 19:32       Ответить с цитатойцитата 

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;
}

6
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 25/12/11 в 19:50       Ответить с цитатойцитата 

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


зависит от того сколько слов надо * 15 символов, и убирать последнее слово, т.к. оно может быть неполным trollface.png

6
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 19:56       Ответить с цитатойцитата 

Слова разные бывают, не говоря уже про юникод. icon_smile.gif

Вообщем я тебя понял, за сим откланиваюсь.

6
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 25/12/11 в 22:43       Ответить с цитатойцитата 

всем спасибо, но что то так и не понял как это работает.
Цитата:
$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

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 23:02       Ответить с цитатойцитата 

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'

6
 



С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010


Передовик Master-X (16.03.2006) Передовик Master-X (01.04.2006) Передовик Master-X (16.04.2006) Передовик Master-X (01.05.2006) Передовик Master-X (01.11.2006) Ветеран трепа Master-X ()
Ссылка на сообщениеДобавлено: 25/12/11 в 23:21       Ответить с цитатойцитата 

попробуй так
Код:

function word_count($text,$count){
   while($count){
   $next_word = strpos($text,' ', $next_word+2);
   $count--;
   }
   return substr($text,0,$next_word);
}

7
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 25/12/11 в 23:38       Ответить с цитатойцитата 

Это вариант как и моя function bar не будут работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.

Поэтому вариант с регуляркой (function foo) самый универсальный, да ещё и самый быстрый (если надо больше, чем 3 слова).

6
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 25/12/11 в 23:54       Ответить с цитатойцитата 

вот это сам накарябал
Код: [развернуть]


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

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

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

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

Последний раз редактировалось: Lexikon (26/12/11 в 00:22), всего редактировалось 1 раз

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

1
 



С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538


Передовик Master-X (01.11.2009) Передовик Master-X (16.11.2009) Передовик Master-X (01.02.2011) Передовик Master-X (01.12.2011) Передовик Master-X (16.12.2011) Ветеран трепа Master-X (01.01.2014)
Ссылка на сообщениеДобавлено: 26/12/11 в 00:21       Ответить с цитатойцитата 

И этот вариант не будет работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.

6
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 26/12/11 в 00:26       Ответить с цитатойцитата 



впринципе строки будут заведомо порядка 20 слов без табуляции и переносов, но на всякий случай можно фильтрануть строку на наличие этих разделителей.

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134

Ссылка на сообщениеДобавлено: 26/12/11 в 07:13       Ответить с цитатойцитата 

ну так ibiz же вроде отличный вариант предложил

1) взять часть текста длинной N
2) посчитать в нем кол-во слов с помощью str_word_count или регулярное выражение
3) убрать последнее слово, так как оно может быть обрезанным
4) из того что осталось выбрать нужно кол-во на вывод

0
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 26/12/11 в 09:33       Ответить с цитатойцитата 

Ну вот еще такой вариант
допустим количество символов в поле вывода ограничено (в моем случае это текст над тумбой в DIV), максимально возможное количество символов вместе с пробелами получается 38. Поэтому урезаю строку до 38 символов, считаю количество элементов массива, и удаляю последний, т.к. им может быть обрезанное слово.
Код: [развернуть]

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

Это конечно длинее чем другие предложенные варианты, ну всё же свое icon_rolleyes.gif

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 07.09.04
Сообщения: 51
Рейтинг: 68

Ссылка на сообщениеДобавлено: 27/12/11 в 11:13       Ответить с цитатойцитата 

Код:
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;
  }



сначала обрезает до нужного количества символов, а после отсекает после последнего пробела как то так

2
 

Люблю то, что делаю!

С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418


Передовик Master-X (16.12.2014) Передовик Master-X (16.02.2017) Передовик Master-X (01.03.2017) Передовик Master-X (16.03.2017) Передовик Master-X (01.09.2017) Ветеран трепа Master-X (16.09.2017)
Ссылка на сообщениеДобавлено: 27/12/11 в 11:45       Ответить с цитатойцитата 

спасибо.

Push Траф для Арбитража : Раз | Два
Есть СНГ траф? Лей сюда!

0
 



С нами с 07.09.04
Сообщения: 51
Рейтинг: 68

Ссылка на сообщениеДобавлено: 27/12/11 в 11:57       Ответить с цитатойцитата 

ессно если проверка и очистка не нужны, например точно знаешь что база чистая, то можно вырезать это
Код:
$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=''

2
 
Новая тема Новая тема   

Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!


Перейти:  



Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »