Autor | Zpráva | ||
---|---|---|---|
zetor22 Profil |
#1 · Zasláno: 20. 10. 2015, 23:39:47
Ahoj,
mám v DB zapsaný text s diakritikou a potřeboval bych ho část vypsat. Když ho uříznu pomocí funkce substr zrovna v místě kde jsou diakritické znaky, tak mi to potom místo toho znaku vypíše otazník. Už jsem to jednou řešil, ale nemůžu si vzpomenout jestli byla nějaká jiná funkce, než je substr, která by to ořízla "šetrně" k diakritickým znakům. Poradíte někdo? |
||
mimochodec Profil |
#2 · Zasláno: 20. 10. 2015, 23:41:41
|
||
zetor22 Profil |
#3 · Zasláno: 20. 10. 2015, 23:44:21
super, díky moc
|
||
mimochodec Profil |
#4 · Zasláno: 20. 10. 2015, 23:50:42
mnemotechnická pomůcka: zapamatuj si, že mb=multibyte a každá řetězcová funkce, u které by podobné rozseknutí dvojic bajtů hrozilo, má svou mb verzi.
|
||
zetor22 Profil |
#5 · Zasláno: 20. 10. 2015, 23:58:58
díky, určitě dobré vědět
|
||
Časová prodleva: 4 dny
|
|||
leorond Profil |
#6 · Zasláno: 24. 10. 2015, 13:46:46
Určitě dobré ale co třeba něco praktického? Také jsem řešil podobnou věc a chce to něco co mi ukáže mnou požadované množství znaků a zároveň neskončí uprostřed slova, ještě to chce něco jako ... pokud je text delší než určený počet znaků a nesmíme zapomínat na diakritiku a html.
Hledal jsem a našel jsem samé nefunkční příklady kódů, proto jsem našel ten nejlepší a upravil jsem ho aby fungoval. function html_cut($s, $limit=150,$whole_word=1){ static $empty_tags = array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param'); $length = 0; $tags = array(); for($i=0; ($i < strlen($s) && $length < $limit) || ($whole_word==1 && ($length >= $limit && (isset($s{$i}) && !preg_match('/\s/',$s{$i})))); $i++) { switch ($s{$i}) { case '<': $start = $i+1; while ($i < strlen($s) && $s{$i} != '>' && !ctype_space($s{$i})) { $i++; } $tag = strtolower(substr($s, $start, $i - $start)); $in_quote = ''; while ($i < strlen($s) && ($in_quote || $s{$i} != '>')) { if (($s{$i} == '"' || $s{$i} == "'") && !$in_quote) { $in_quote = $s{$i}; } elseif ($in_quote == $s{$i}) { $in_quote = ''; } $i++; } if ($s{$start} == '/') { $tags = array_slice($tags, array_search(substr($tag, 1), $tags) + 1); } elseif ($s{$i-1} != '/' && !in_array($tag, $empty_tags)) { array_unshift($tags, $tag); } break; case '&': $length++; while ($i < strlen($s) && $s{$i} != ';') { $i++; } break; default: $length++; } } $s = substr($s, 0, $i); $s=preg_replace('/[\s]$/is','',$s); if(!preg_match('/>[\s]{0,}$/is',$s) && !preg_match('/[\.!\?]$/is',$s)){$s .= '...';} if ($tags) { $s .= "</" . implode("></", $tags) . ">"; } return $s; } Tento kód sem nedávám abych pod ním viděl spoustu komentářů že je v něm něco špatně, pokud najdete chybu i já jsem jen člověk. Budu rád když mi případné chyby pomůžete opravit. |
||
Časová prodleva: 9 let
|
0