Съкращение на текст?

nom3r1

Registered
Правя съкращението на текста със функцията mb_substr или по-точно:
mb_substr($row['text'], 0, 300);

обаче, когато 300 символа се стигнат то реже цялата дума. Тоест, ако имам:
Правя съкращението на текста със функцията mb_substr или по-точно

то ще го направи на:

Правя съкращението на текста със функ...

примерно, а искам самата дума да излиза цяла тоест функцията

:?:
 
PHP:
<?php
$text = "Правя съкращението на текста със функцията mb_substr или по-точно";
$string1 = stripslashes(nl2br($text));
if(strlen($string1) >460) {//тука си гласяш до колко символа искаш да съкращава
$i = 459;//символите - 1 !!!
while($string1[$i] != " ") {//тук на кой символ да съкращава... можеш да сложиш "." "!" "?"
$i += 1; 
}
$mbtext = substr($string1, 0, $i)."...";
} else {
$mbtext = $string1;
}	
echo $mbtext;	
?>

:wink:
 
Измислих нещо малко, сигурно има бъгове.

Код:
<?php

$str = <<<STR
It is a long established fact that a reader will be distracted by the readable content of a 
page when looking at its layout. The point of using Lorem Ipsum is that it has a more-or-less 
normal distribution of letters, as opposed to using 'Content here, content here', making it look 
like readable English. Many desktop publishing packages and web page editors now use Lorem Ipsum as 
their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. 
Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).
STR;

$str2 = 'Някакъв тест.. тестване';
$specialchars = array_merge(range('a', 'z'), range('A', 'Z'), range('а', 'я'), range('А', 'Я'));

function cut_full_str($str, $len) {
    global $specialchars;
    
    if(in_array($str[$len-1], $specialchars)) {
        return cut_full_str($str, $len+1);
    }
    
    return substr($str, 0, $len);
}

echo cut_full_str($str, 301);
echo '<br />';
echo cut_full_str($str2, 5);
 
Код:
<?php
function sakra6tenie($promenliva,$promenliva2,$promenliva3) {
$razdelqne = explode(" ",$promenliva); // разделяме текста на думи
$kolko_dumi = count($razdelqne); // преброяваме колко думи имаме в даденият текст
if ($kolko_dumi > $promenliva2) { // тук правим проверка дали думите в текста са повече от указаният от нас брой
for ($i=0;$i<$promenliva2;$i++) {
$izhod .= $razdelqne[$i]." ";
}
echo $izhod.$promenliva3; // тук изкарваме текста,но с първите няколко думи, които желаем само да се показват
} else {
echo $promenliva; // тук изкарваме всички думи, защото текста не надхвърля указаният от нас брой думи
}
}
?>
Може да я сложим в друг или директно в страницата, в която искате да изкарате съкратеният текст.
Въпросът е да е над кода, който ще дам по-долу.
А ето го и него:
Код:
<?php
$text = "как сме днес.";
sakra6tenie($text,2,"...");
?>
$text - сменете го с променливата, в която ви е текста.
2 - колко думи от текста да изкарва. Ако искате повече от 2 просто го сменете.
... - тези точки ще излизат ако текста е по-дълъг от броя думи, които сте указали.
 
StormBreaker каза:
http://web-tourist.net/forum/viewtopic.php?t=109985

@Storm, това разпределя само празните места, но ако има 'Текст, за рязане' ще върне 'Текст,'
 
Направи си две полета :)
Не е проблем да копнеш първите 2-3 изречения и да ги поставиш :)
 
alex3 каза:
StormBreaker каза:
http://web-tourist.net/forum/viewtopic.php?t=109985

@Storm, това разпределя само празните места, но ако има 'Текст, за рязане' ще върне 'Текст,'

Нещо не те разбрах. Нищо не разпределя, просто реже на първото срещнато празно място преди лимита (от дясно на ляво).
 
Да, но ако текста е 'Текст, със запетая' и трябва а среже след 1вия знак, ще отреже 'Текст,'
 
@Styl3rbg,
не ми трябват излишни полета.

Реших да използвам кода, който е дал @StormBreaker, в темата си, но с лека промяна на един от потребителите.
PHP:
function CutToWord($str, $len, $dots = '', $enc = "UTF-8"){
	if (mb_strlen($str, $enc) < $len)
		return $str;
	for ($i = $len; $i > 0; $i--)
	if (mb_substr($str, $i, 1, $enc) == ' ')
	return mb_substr($str, 0, $i, $enc).$dots;
	return mb_substr($str, 0, $len, $enc).$dots;
}

Не съм ги тествал кодовете, който горните потребители са дали, но най-кратък код ми се видя този и се оказа функционален - върши ми перфектна работа.

Не го казвам често, но благодаря на всички отзовали се. :?:

@alex3, да прав си за запетаята.
 
alex3 каза:
Да, но ако текста е 'Текст, със запетая' и трябва а среже след 1вия знак, ще отреже 'Текст,'

Ако трябва да среже след първия ще остане 'T'. :)
 
Ev0luti0N каза:
Само от любопитсво, защо фукцията връща два return :idea: :shock:

Виж кода в темата, която даде @Storm. Ще видиш, че не са 2 return-a последователни. Просто единия се извиква, ако условието върне true, а другия се вика, ако се стигне до самия край на функцията(т.е. ако условието е true ще върне него си return и функцията спира, но ако върне false ще продължи надолу и ще върне другия return)

И само да отбележа, че както е представен кода от @Storm има значение табулацията :?:
 
relax4o каза:
Ev0luti0N каза:
Само от любопитсво, защо фукцията връща два return :idea: :shock:

Виж кода в темата, която даде @Storm. Ще видиш, че не са 2 return-a последователни. Просто единия се извиква, ако условието върне true, а другия се вика, ако се стигне до самия край на функцията(т.е. ако условието е true ще върне него си return и функцията спира, но ако върне false ще продължи надолу и ще върне другия return)

И само да отбележа, че както е представен кода от @Storm има значение табулацията :?:

Точно. То няма значение подреждането за самия код, но така е по-трудно да се види самата структура :)

PHP:
for ($i = $len; $i > 0; $i--)
	if (mb_substr($str, $i, 1, $enc) == ' ')
		return mb_substr($str, 0, $i, $enc).$dots;
 
StormBreaker каза:
relax4o каза:
Ev0luti0N каза:
Само от любопитсво, защо фукцията връща два return :idea: :shock:

Виж кода в темата, която даде @Storm. Ще видиш, че не са 2 return-a последователни. Просто единия се извиква, ако условието върне true, а другия се вика, ако се стигне до самия край на функцията(т.е. ако условието е true ще върне него си return и функцията спира, но ако върне false ще продължи надолу и ще върне другия return)

И само да отбележа, че както е представен кода от @Storm има значение табулацията :?:

Точно. То няма значение подреждането за самия код, но така е по-трудно да се види самата структура :)

PHP:
for ($i = $len; $i > 0; $i--)
	if (mb_substr($str, $i, 1, $enc) == ' ')
		return mb_substr($str, 0, $i, $enc).$dots;

Има вероятност и да изгърми, когато не се загражда с фигурни скоби, и когато не се ползва табулация.
 
relax4o каза:
Има вероятност и да изгърми, когато не се загражда с фигурни скоби, и когато не се ползва табулация.

Няма никакъв проблем и на един ред да го напишеш. Това е компютър - няма вероятност да го разбере различно.
 
Ако след if стойноста ти е една тоест само return никакъв не е проблема да няма скоби, но ако има повече редове $promenliva = $promenlivasta2; return $promenliva; Тогава е хубаво да има скоби. :?:
 

Back
Горе