Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 25/12/11 в 17:47 |
сново обращаюсь за помощью, решил сделать вывод части текста. Сначала сделал вывод определенного кол-ва символов, но как то уродско получается.
Решил сделать вывод нескольких слов из строки. Функцию не нашел такую, решил как вариант загнать строку в массив, т.е. разбить текст по словам и выводить несколько элементов из массива. Но это как мне кажется неправильно ибо если текст большой, то уже нагрузка будет. Подскажите как это проще сделать. Спасибо!
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 25/12/11 в 17:53 |
а текст изначально где хранится, в памяти, переменной, файле?
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 25/12/11 в 18:06 |
$desc обрезается на границе предложения так, чтобы было не больше 200 символов.
Код: | $desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) ); |
|
|
|
|
С нами с 16.07.06
Сообщения: 886
Рейтинг: 892
|
Добавлено: 25/12/11 в 18:10 |
Считай количество пробелов в строке.
При нахождении нужного тебе N-нного пробела отсекай все, что дальше найденной позиции в строке.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 25/12/11 в 18:13 |
ibiz писал: | а текст изначально где хранится, в памяти, переменной, файле? |
текст беру из файла, обрезаю и записываю в новый файл уже с нужным кол-вом слов.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 25/12/11 в 18:15 |
Yacc писал: | $desc обрезается на границе предложения так, чтобы было не больше 200 символов.
Код: | $desc = preg_replace( '#(?<=[.!?])[^.!?]+$#i', '', substr( $desc, 0, 200 ) ); | |
производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 25/12/11 в 18:19 |
ibiz писал: | производительнее будет использовать substr от strpos до первого пробела до/после нужного кол-ва символов |
Код в студию.
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 25/12/11 в 18:35 |
Yacc писал: | Код в студию. |
думаю стоит начать со чтения части файла, а не целиком:
Код: | <?php
$simb = 200;
$file_txt = fopen("text.txt", "r");
$contents = fread($file_txt, $simb);
fclose($file_txt);
?> |
а затем глянуть две очень интересные функции php:
wordwrap и str_word_count, и возможно случится счастье
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 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;
} |
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 25/12/11 в 19:50 |
Yacc писал: | А как ты узнаешь сколько байт считывать?
|
зависит от того сколько слов надо * 15 символов, и убирать последнее слово, т.к. оно может быть неполным
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 25/12/11 в 19:56 |
Слова разные бывают, не говоря уже про юникод.
Вообщем я тебя понял, за сим откланиваюсь.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 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";
выводится весь текст, как бы я ни крутил
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 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'
|
|
|
|
С нами с 24.10.04
Сообщения: 18881
Рейтинг: 9010
|
Добавлено: 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);
}
|
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 25/12/11 в 23:38 |
Это вариант как и моя function bar не будут работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.
Поэтому вариант с регуляркой (function foo) самый универсальный, да ещё и самый быстрый (если надо больше, чем 3 слова).
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 25/12/11 в 23:54 |
вот это сам накарябал
Код: [развернуть] |
<?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 раз
|
|
|
|
С нами с 09.03.09
Сообщения: 6053
Рейтинг: 3538
|
Добавлено: 26/12/11 в 00:21 |
И этот вариант не будет работать как надо, если в тексте есть отличные от пробела разделители: \n, \r, \t.
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 26/12/11 в 00:26 |
впринципе строки будут заведомо порядка 20 слов без табуляции и переносов, но на всякий случай можно фильтрануть строку на наличие этих разделителей.
|
|
|
|
С нами с 05.05.05
Сообщения: 1913
Рейтинг: 1134
|
Добавлено: 26/12/11 в 07:13 |
ну так ibiz же вроде отличный вариант предложил
1) взять часть текста длинной N
2) посчитать в нем кол-во слов с помощью str_word_count или регулярное выражение
3) убрать последнее слово, так как оно может быть обрезанным
4) из того что осталось выбрать нужно кол-во на вывод
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 26/12/11 в 09:33 |
Ну вот еще такой вариант
допустим количество символов в поле вывода ограничено (в моем случае это текст над тумбой в 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;
Это конечно длинее чем другие предложенные варианты, ну всё же свое
|
|
|
|
С нами с 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(' ','<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;
}
|
сначала обрезает до нужного количества символов, а после отсекает после последнего пробела как то так
|
|
|
|
Люблю то, что делаю!
С нами с 22.10.06
Сообщения: 5053
Рейтинг: 4418
|
Добавлено: 27/12/11 в 11:45 |
спасибо.
|
|
|
|
С нами с 07.09.04
Сообщения: 51
Рейтинг: 68
|
Добавлено: 27/12/11 в 11:57 |
ессно если проверка и очистка не нужны, например точно знаешь что база чистая, то можно вырезать это Код: | $str=preg_replace('/\s+/',' ',
trim(strip_tags(str_replace(
array(' ','<li>'),// если надо
array(' ',' '),
$str))));
или заменить на
$str=preg_replace('/\s+/',' ',trim($str));
или на
$str=trim($str);
|
$maxlen нужное количество символов
если окончание не нужно, то $suffix=''
|
|
|
|