Autor Zpráva
perwin
Profil
Ahoj,
potřeboval bych script, který vypíše tři tečky (...) po určitém počtu slov.
Děkuji
Taps
Profil
perwin:
http://php.vrana.cz/zkraceni-textu-s-xhtml-znackami.php
perwin
Profil
Taps:
Našel jsem toto:
<?php
if (strlen($text) <= $limit) {
    echo $text;
} else {
    $text = substr($text, 0, $limit+1);
    $pos = strrpos($text, ""); 
    echo substr($text, 0, ($pos ? $pos : -1)) . "...";
}
?>

Nojo ale kde je ten text, co se bude krátit a kam ho mam vložit?
A kde se nastavuje po kolika znacích (slovech) se zkrátí?
Díky
Keeehi
Profil
perwin:
Že by v proměnné $text byl ten text a v proměnné $limit ta délka?

Pozor! Tento script krátí podle počtu písmen, ne slov.
perwin
Profil
Keeehi:
Že by v proměnné $text byl ten text a v proměnné $limit ta délka?
Toto:
<?php
if (strlen($text) <= $limit) {
    echo $text;
} else {
    $text = substr($text, 0 /* počet písmen po kterém se bude krátit */, $limit+1);
    $pos = strrpos($text, "text, který se bude krátit"); 
    echo substr($text, 0, ($pos ? $pos : -1)) . "...";
}
?>
?

Pozor! Tento script krátí podle počtu písmen, ne slov.
Ale tam není žádný script, který by krátil text podle počtu slov.
Prosím poraďte. Dík
Keeehi
Profil
K přemýšlení by tě bylo těžké dohnat, takže tady máš řešení:
<?php
$text = "tvůj text ke zkrácení";
$limit = 100; //počet písmen;
if (strlen($text) <= $limit) {
    echo $text;
} else {
    $text = substr($text, 0, $limit+1);
    $pos = strrpos($text, " "); 
    echo substr($text, 0, ($pos ? $pos : -1)) . "…";
}
?>

A začni se učit.
joe
Profil
Myslím, že v dnešní době by mohlo stačit toto.
kubik
Profil
$pole = Split(" ", $text_puvodni, $limit + 1);
$pole[$limit] = "";
$text_zkraceny = Implode($pole, " ")."&hellip;";


V $limit je počet slov, na který se zkracuje ten text. Předpokladem je, že oddělovačem slov je mezera, jinak by se musel upravit první parametr funkce Split().
imploder
Profil
Nikdo tady zatím použitelné řešení nenabídl ani nepopsal, takže tady je moje. Dá se bez obav použít i na velmi dlouhý text, protože pracuje jen se začátkem (tj. jen to, co se má vypsat). Do $znaky_predelu je možné přidat i jiné bílé znaky, které se můžou v textu vyskytnout (např. tabulátor).
<?php
header('Content-Type: text/plain; charset=utf-8');

// začátek textu (prvních n slov) + "..."
function zacatek($text, $n) {
  // znaky, kterými můžou být oddělena slova;
  // cokoliv jiného se považuje za součást slova
  $znaky_predelu = " \n";

  $delka_textu = strlen($text);
  $delka = 0;

  for ($slov = 0; $slov < $n; $slov++) {
    // pokud za předělem už nic není, skonči;
    // jinak vyber text do konce předělu
    $tmp_delka = $delka;
    $tmp_delka += strspn($text, $znaky_predelu, $delka);
    if ($tmp_delka == $delka_textu)
      break;
    else
      $delka = $tmp_delka;

    // vyber text do konce slova
    $delka += strcspn($text, $znaky_predelu, $delka);

    // pokud za slovem už nic není, skonči
    if ($delka == $delka_textu)
      break;
  }

  $zacatek = substr($text, 0, $delka) . (($delka < $delka_textu) ? '...' : '');
  return $zacatek;
}


$text = 'Našel to dědeček,
našel to v lese.
Napích to na klacík,
domů to nese.

Babička myslela,
že jsou to houby,
dala to na pekáč,
šup s tím do trouby.

Děti to sežraly,
pak byly zticha,
protože dostali
bolení břicha.

"Dědečku ty jsi vůl,
není ti rovno,
vždyť jsi přinesl
místo hub ********!!!"';

echo zacatek($text, 9);

?>

EDIT: opravil jsem to tak, aby se při vybrání celého textu za něj tři tečky nepřipojovaly
perwin
Profil
Nojo, ale co když chci, aby se mi neořízli i HTML značky? třeba když je v textu z db: <a href="web.php">text</a> a vypsalo by se mi <a hr... - tak to je problém... našel jsem tento script:
<?php
function orizni_html($s, $limit){
    static $empty_tags = array('area', 'base', 'basefont', 'br', 'col', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param');
    $length = 0;
    $tags = array(); // dosud neuzavřené značky

    if(strlen($s) > $limit){
      $tri_tecky = "...";
    } else {
      $tri_tecky = "";
    }

    for ($i=0; $i < strlen($s) && $length < $limit; $i++) {

        switch ($s{$i}) {

        case '<':
            // načtení značky
            $start = $i+1;
            while ($i < strlen($s) && $s{$i} != '>' && !ctype_space($s{$i})) {
                $i++;
            }
            $tag = strtolower(substr($s, $start, $i - $start));
            // přeskočení případných atributů
            $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} == '/') { // uzavírací značka
                $tags = array_slice($tags, array_search(substr($tag, 1), $tags) + 1);
            } elseif ($s{$i-1} != '/' && !in_array($tag, $empty_tags)) { // otevírací značka
                array_unshift($tags, $tag);
            }
            break;

        case '&':
            $length++;
            while ($i < strlen($s) && $s{$i} != ';') {
                $i++;
            }
            break;

        default:
            $length++;

        }
    }
    $s = substr($s, 0, $i);
    $s .= $tri_tecky;
    if ($tags) {
        $s .= "</" . implode("></", $tags) . ">";
    }

    return $s;
}
?>

A počítám s tím, že $s je text, který se má oříznout a $limit je max. počet písmen. Jenže napíše mi to:
Fatal error: Cannot redeclare orizni_html() (previously declared in /home/users/perwin/web.cz/web/zobraznovinky.php:18) in /home/users/perwin/web.cz/web/zobraznovinky.php on line 18
A na řádku 18 je:
function orizni_html($s, $limit){
Prosím poraďte mi, co s tím. Děkuji
Marek88
Profil
perwin:
Cannot redeclare orizni_html() (previously declared in /home/users/perwin/web.cz/web/zobraznovinky.php:18) in /home/users/perwin/web.cz/web/zobraznovinky.php on line 18

Nelze znovu delkarovat funkci orizni_html() na řádku 18. (funkce již byla deklarována v /home/users/perwin/web.cz/web/zobraznovinky.php na řádku 18)

Nemáš to, co jsi sem poslal třeba v cyklu?
perwin
Profil
Marek88:
Jak v cyklu?
perwin
Profil
Marek88:
Myslíš v cyklu while { } ? Ano, mám.
xmark
Profil
perwin:
Tak to z něj vytáhni.
perwin
Profil
xmark:
Ale to nemohu. Ten zařizuje, aby se vypisovali všechny výsledky z db pomocí předlohy:
while($Vysledek = mysql_fetch_array($query)) { echo " ".$Vysledek['blablabla']." "; }
xmark
Profil
perwin:
Pokoušíš se opakovaně definovat funkci. Funkci můžeš volat kolikrát chceš, ale definovat ji můžeš jen jednou. Čemu na tom nerozumíš?
perwin
Profil
xmark:
Aha takže to co jsem poslal v [#10] dám mimo while a echo $s; dám do while?

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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