Zadejte hledaný výraz...

Crop sentence?

One
verified
rating uzivatele
6. 8. 2010 17:32:11
Ahoj, je tu spousta chytrých lidí, tak se poradím,
jak byste co nejjednodušeji střihli text po 30 znacích zleva, ale až v mezeře mezi slovy, ne natvrdo tj. aby nedošlo ke střihnutí v půlce slova jako v tomto případě:
substr($buffer,0,30)
funkce přímo na to asi není tak kombinace více funcí, která je nejefektivnější?
a aby to třeba nebylo jedno německý slovo od 29 znaku dlouhé 50 písmen, tak na to ještě jenou pak pustit asi substr($buffer,0,45) pro maximální oříznutí na 45, pokud od 30 do 45 nebude žádná mezera?
díky za tipy
6. 8. 2010 17:32:11
https://webtrh.cz/diskuse/crop-sentence#reply539380
function shortText($text)
{
$chars = 30;
$text = $text . " ";
$text = substr($text, 0, $chars);
$text = substr($text, 0, strrpos($text, ' '));
return $text;
}
6. 8. 2010 17:49:50
https://webtrh.cz/diskuse/crop-sentence#reply539379
hm
verified
rating uzivatele
(20 hodnocení)
6. 8. 2010 18:01:24
zaprvé, doporucuji pouzivat UTF8 fce a utf 8 kodovani - substr tedy rovnou vyluc, btw tohle je fce kterou jsme ted napsal z fleku, melo by to fungovat... nerikam ze ej optimalni, jen to bylo rychly reseni co me ted napadlo a vyresi vsechno cos psal - tedy i s tim dlouhym slovem atd... ppokyho reseni nahore je fajn, ale zaprve bez UTF8 (specialni znaky to bude orezavat spatne, staci jedno čřšěč nebo podobně a jsi v pytli) a za druhe nevyresi vsehcno cos psal... tedy pokud jsem te dobre pochopil ;) snad to k necemu bude
$text = "tenhle textík má víc jak třicet znaků a pokud slovo presahuje pres tricet znaku a dostane se jeste do 45ti tak se zobrazí !";
function _mb_substr($str, $start, $length, $encoding = 'UTF-8') {
$max_extension = 15; // tady se nastavuje tolerance ;)
if(mb_strlen($str,$encoding)>$length+$max_extension)
$str = mb_substr($str,$start,$length+$max_extension,$encoding);
$exploded = explode(' ',$str);
$temp_str = '';
$return_str = '';
foreach($exploded as $word){
$temp_str .= ((mb_strlen($temp_str,$encoding)>0)?' ':'').$word;
if(mb_strlen($temp_str,$encoding)>$length+$max_extension)
return $return_str;
elseif(mb_strlen($temp_str,$encoding)>$length && mb_strlen($temp_str,$encoding)<$length+$max_extension){
return $temp_str;
} else
$return_str = $temp_str;
}
}
echo _mb_substr($text, 0, 30);
6. 8. 2010 18:01:24
https://webtrh.cz/diskuse/crop-sentence#reply539378
chces prvnich 30-45 znaku az po prvni mezeru nebo jiny whitespace znak (v ungreedy modu), tzn. nejak takhle:
$str = "falksdjf alskdj fialskdfj aluksd fjalaksd jfalaksd fjaalksdjf aalksdf ja";
echo preg_replace ( "%^(.{30,45}?s).*%", "$1", trim ( $str ) );
a pokud jde o utf-8, ja bych rekl, ze by ti bohate stacilo pouzit iconv pro prevedeni do nativu a pak zase zpatky:
echo iconv ( "ISO-8859-1", "UTF-8", preg_replace ( "%^(.{30,45}?s).*%", "$1", trim ( iconv ( "UTF-8","ISO-8859-1", $text ) ) ) );
6. 8. 2010 20:53:53
https://webtrh.cz/diskuse/crop-sentence#reply539377
Petr Vacek
verified
rating uzivatele
7. 8. 2010 02:32:38
Napsal vedouci;549520
echo iconv ( "ISO-8859-1", "UTF-8", preg_replace ( "%^(.{30,45}?s).*%", "$1", trim ( iconv ( "UTF-8","ISO-8859-1", $text ) ) ) );
Tak by to taky šlo, ale preg_replace podporuje utf8, akorát je nutné použít přepínač "u"
echo preg_replace ( "%^(.{30,45}?s).*%u", "$1", $text );
7. 8. 2010 02:32:38
https://webtrh.cz/diskuse/crop-sentence#reply539376
One
verified
rating uzivatele
7. 8. 2010 15:40:36
to je ono, tak diky vsem za inspiraci, prostuduji protestuji upravim
diky
vsem jsem pridal hodnoceni...
7. 8. 2010 15:40:36
https://webtrh.cz/diskuse/crop-sentence#reply539375
Pro odpověď se přihlašte.
Přihlásit