Autor Zpráva
zetor22
Profil
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
php.net/manual/en/function.mb-substr.php
zetor22
Profil
super, díky moc
mimochodec
Profil
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
díky, určitě dobré vědět
leorond
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: