Autor Zpráva
MikeCZ
Profil
Ahoj.

Pomocí funkce substr() usekávám obsah řetězce, pokud je větší jak 1000 znaků... problém je v tom, že v tom obsahu jsou i tagy, konkrétně jen <a><br /><br> (ostatní parsuju, takže se tam nevyskytují) a v tom případě se někdy stane, že to useknu tak, že na konci je zbyde například "<br" a to dělá neplechu ve zbytku kódu... Tedy mělo by se to useknout za celým slovem a zároveň by to mělo být za ukončením párového tagu <a></a>, aby se nestale, že to usekne uprostřed a </a> už tam nebude...

Díky za každou pomoc.
Alphard
Profil
PHP triky - Zkrácení textu s XHTML značkami
MikeCZ
Profil
Alphard:
PHP triky - Zkrácení textu s XHTML značkami

Díky, je tam tenhle kód, který opraví xhtml značky.
Ale v něm už není kód, který zajišťuje, že text bude odřezán za celým slovem...

// tenhle kód zajistuje, ze text bude useknut za celym slovem...
$text = substr($text, 0, $limit+1);
$pos = strrpos($text, " "); // v PHP 5 by se dal použít parametr offset
echo substr($text, 0, ($pos ? $pos : -1)) . "...";


// tenhle opravuje xhtml
/** Zkrácení textu s XHTML značkami
* @param string zkracovaný řetězec bez komentářů a bloků skriptu
* @param int požadovaný počet vrácených znaků
* @return string zkrácený řetězec se správně uzavřenými značkami
* @copyright Jakub Vrána, http://php.vrana.cz/
*/
function xhtml_cut($s, $limit) {
    $length = 0;
    $tags = array(); // dosud neuzavřené značky
    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 = 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
                array_shift($tags); // v XHTML dokumentu musí být vždy uzavřena poslední neuzavřená značka
            } elseif ($s[$i-1] != '/') { // otevírací značka
                array_unshift($tags, $tag);
            }
            break;
        
        case '&':
            $length++;
            while ($i < strlen($s) && $s[$i] != ';') {
                $i++;
            }
            break;
        
        default:
            $length++;
            /* V případě kódování UTF-8:
            while ($i+1 < strlen($s) && ord($s[$i+1]) > 127 && ord($s[$i+1]) < 192) {
                $i++;
            }        
            */
        
        }
    }
    $s = substr($s, 0, $i);
    if ($tags) {
        $s .= "</" . implode("></", $tags) . ">";
    }
    return $s;
}
MikeCZ
Profil
Už to mám. Easy.

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:

0