Master-X
Регистрация
|
Вход
Форум
|
Новости
|
Статьи
Главная
»
Форум
»
Программинг, Скрипты, Софт, Сервисы
»
Тема:
Вывод определенного количества слов
Новая тема
Ответить
цитата
25/12/11 в 17:47
Lexikon
сново обращаюсь за помощью, решил сделать вывод части текста. Сначала сделал вывод определенного кол-ва символов, но как то уродско получается.
Решил сделать вывод нескольких слов из строки. Функцию не нашел такую, решил как вариант загнать строку в массив, т.е. разбить текст по словам и выводить несколько элементов из массива. Но это как мне кажется неправильно ибо если текст большой, то уже нагрузка будет. Подскажите как это проще сделать. Спасибо!
цитата
25/12/11 в 17:53
ibiz
а текст изначально где хранится, в памяти, переменной, файле?
цитата
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 писал:
а текст изначально где хранится, в памяти, переменной, файле?
текст беру из файла, обрезаю и записываю в новый файл уже с нужным кол-вом слов.
цитата
25/12/11 в 18:15
ibiz
Yacc писал:
$desc обрезается на границе предложения так, чтобы было не больше 200 символов.
Код:
$desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) );
производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов
цитата
25/12/11 в 18:19
Yacc
ibiz писал:
производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов
Код в студию.
цитата
25/12/11 в 18:35
ibiz
Yacc писал:
Код в студию.
думаю стоит начать со чтения части файла, а не целиком:
Код:
<?php
$simb = 200;
$file_txt = fopen("text.txt", "r");
$contents = fread($file_txt, $simb);
fclose($file_txt);
?>
а затем глянуть две очень интересные функции php:
wordwrap и str_word_count, и возможно случится счастье
цитата
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 символов, и убирать последнее слово, т.к. оно может быть неполным
цитата
25/12/11 в 19:56
Yacc
Слова разные бывают, не говоря уже про юникод.
Вообщем я тебя понял, за сим откланиваюсь.
цитата
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";
выводится весь текст, как бы я ни крутил
цитата
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
незнаю на сколько верен мой вариант
Единственное наверно еще стоит перед занечением в массив избавить строку от лишних пробелов, удалить возможные пробелы в начале и в конце и двойные, а затем уже работать с этой строкой.
Последний раз редактировалось: 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;
Это конечно длинее чем другие предложенные варианты, ну всё же свое
цитата
27/12/11 в 11:13
azh
Код:
function content_cut($str,$maxlen=0,$suffix='...') {
$str=preg_replace('/\s+/',' ',
trim(strip_tags(str_replace(
array(' ','<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;
}
тут добавил еще раз дополнительную проверку на длину, не помню зачем..... не помню нужна ли она...
для гуглбэйс титлы обрезались до 70 помоему...
function content_cut($str,$maxlen=0,$suffix='...') {
$str=preg_replace('/\s+/',' ',
trim(strip_tags(str_replace(
array(' ','<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(' ','<li>'),// если надо
array(' ',' '),
$str))));
или заменить на
$str=preg_replace('/\s+/',' ',trim($str));
или на
$str=trim($str);
$maxlen нужное количество символов
если окончание не нужно, то $suffix=''
Новая тема
Ответить
Эта страница в полной версии