IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Zkrácení HTML textu

Aktivity
Avatar
Jan Poláček
Tvůrce
Avatar
Jan Poláček:24.8.2014 17:38

Ahoj, mám takový problém, mám v DB text s HTML značkami (výstup TinyMCE), používám takovou jednoduchou funkci

function getZkraceny($text, $pocet_slov = 70)
{
        $zkraceny = "";
        $slovo = explode(" ", $text);
        for($i = 0; $i < $pocet_slov; $i++)
        {
                $zkraceny = $zkraceny." ".$slovo[$i];
        }
        return $zkraceny;
}

Ale bohužel je to spíš na obyčejný text, ne na HTML, kde se mi samozřejmě stává, že se mi neuzavřou tagy a tím pádem se zbytek webu rozhodí.

Poradí někdo, jak bojovat se zkrácením HTML textu :) ?

Odpovědět
24.8.2014 17:38
Instrukce na adrese 0x77104f29 odkazovala na adresu paměti 0x00000014. S pamětí nelze provést operaci: written.
Avatar
Odpovídá na Jan Poláček
Michal Štěpánek:24.8.2014 19:19

Nestačilo by třeba nějak zkontrolovat, jestli tam nějaké tagy jsou a pak je tam případně dodat (ty uzavírky)? Nevím, je to jen nápad... Popravdě ani nevím, jak by to šlo provést...

Editováno 24.8.2014 19:19
Nahoru Odpovědět
24.8.2014 19:19
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Jan Poláček
Tvůrce
Avatar
Odpovídá na Michal Štěpánek
Jan Poláček:24.8.2014 19:23

Ano, nad tím taky uvažuju, ale nemám představu, přece jen tam můžou být různý tagy a některý se uzavřou přímo při procházení, takže asi pole, do kterého budu přidávat a odebírat ukončovací tagy, co zbyde, dám na konec, horší bude, když se mi to zastaví třeba uvnitř img :D

Nahoru Odpovědět
24.8.2014 19:23
Instrukce na adrese 0x77104f29 odkazovala na adresu paměti 0x00000014. S pamětí nelze provést operaci: written.
Avatar
Odpovídá na Jan Poláček
Michal Štěpánek:24.8.2014 19:42

To bych až zas jako problém neviděl, když bude kontrolovat "<" a oproti tomu musí najít ">", jinak to nesmí zkrátit... Mezi těmito znaky stejné (další) být nemůžou, ne?

Nahoru Odpovědět
24.8.2014 19:42
Nikdy neříkej nahlas, že to nejde. Vždycky se totiž najde blbec, který to neví a udělá to...
Avatar
Pavel Mareš
Tvůrce
Avatar
Pavel Mareš:24.8.2014 19:49

Mám otázku, chceš odstranit ty html tagy nebo ne? Jestli ne, tak to bude velmi jednoduché. Na druhou stranu by se ta dalo udělat i s nimi, ale pokud to použiješ tak jak si myslím, zkrácený text s nějakým html je k ničemu (ale nevím na co přesně to chceš). Jen mi řekni, zda tam mají ty tagy zůstat či ne.

Nahoru Odpovědět
24.8.2014 19:49
Však ono půjde ...
Avatar
Jan Poláček
Tvůrce
Avatar
Odpovídá na Pavel Mareš
Jan Poláček:24.8.2014 19:51

Zůstat právě že mají, jde o seznam aktuálních článků, a např kurzívu, tučné, odkazy tam chci mít nechat zanechané.

Nahoru Odpovědět
24.8.2014 19:51
Instrukce na adrese 0x77104f29 odkazovala na adresu paměti 0x00000014. S pamětí nelze provést operaci: written.
Avatar
Michal Žůrek - misaz:24.8.2014 20:12

jestli je to funkce, která má vzít prvních XYZ slov z textu a ty se pak použijí v seznamu článků jako popisek, tak je nejjednoduší odstranit třeba regulárním výrazem HTML a vypsat to normálně do P bez všelijakých zvýraznění a kdajakých blbůstek. Takové věci stejně vy výpisu nemají co dělat. Pokud jakože nutně tam to HTML potřebuješ, tak si prostě projdeš ten text postupně, napočítáš slova a HTMl tagy při počítání přeskočíš.

Metoda getZkraceny podle názvu nemá do HTML co šahat, žádný ukončovací tag nemá doplňovat. To má na starost třeba specializovana metoda getUzavrenyText (ideálně bez slova get, ale do návrhu appky ti nevidím).

Editováno 24.8.2014 20:13
 
Nahoru Odpovědět
24.8.2014 20:12
Avatar
Pavel Mareš
Tvůrce
Avatar
Pavel Mareš:24.8.2014 20:21

Já jsem si s něčím podobným hrál, ale mě se to do db ukládalo, už tak jak jsem chtěl, ukáži příklad.

Lorem ipsum <strong> dolor </strong> ... ahojky já jsem<span class='cosi'> Pavel </span>

Tento text jsem si do db ukládal tak, abych si ho při výpisu mohl snadno zpracovat. (všeobecně je lepší kontrolovat zápis než výpis, je to lehčí a lepší)

Lorem ipsum [strong]dolor[/strong] ... ahojky já jsem [span-class='cosi']Pavel[/span]

Tímto jsem lehce docílil lehčího výpisu. Slova totiž jsou oddělena mezerou (třeba   ale to není důležité) a do mezer v tagu jsem hodil pomlčky místo mezer. Pak už jen explode (např) na mezery a máš počet slov. Nejprve jsem si vzal konec textu, jestli tam není tag bez textu nebo něco jiného špatně, pokud tam nebyl text, odmazal jsem vše od pozice první závorky až do konce (teď už pracuji s pozicí znaků). Pak už jen zbývalo nahradit ničím tagy, které to nepodporovalo. To jsem udělal tak, že jsem si roztřídil text na tagy a text normální, po úpravě to vypadá nějak takto:

Lorem ipsum [strong]dolor[/strong] ... ahojky já jsem [span-class='cosi']Pavel[/span]

Lorem ipsum ;dolor; ... ahojky já jsem ;Pavel;

Toho jsem docílil velmi jednoduše. Vše co bylo uvnitř jsem vložil do array s číslem a při výpisu to program bral takto: Jé hele ;, kolik je $counter? Program zjistí že 0 ($counter se na začátku = 0), tak vezme z array s tagy hodnotu s klíčem 0. Pak tam byla kontrola zda daný tag je podporován, což je velmi jednoduchá kontrola (snad nemusím zmiňovat). Když to nenalezlo daný tag v povolených tak místo doplnění tagu jsem dosadil nic, resp v php -> "". Pak už jsem nahradil hranaté závorky ostrými a vypsal. Je to jednoduché a účinné. Ano má to pár chyb, ale na takový základ to stačí.
Pokud bys chtěl něco honosnějšího, hledej na googlu. (Toto je moje metoda vytvořená k funkčnosti a k porozumění - tehdy jsem ještě nebyl tolik nadaný. Je to prostě jen moje, dá se to vytvořit i jinak, viděl jsem.) Jo a musíš mít +- ochráněný vstup, aby uživatel nemohl zadávat všechny možná kraviny, tohle je jen část z celého mého programu, celý to psát samozřejmě nebudu.

Editováno 24.8.2014 20:22
Nahoru Odpovědět
24.8.2014 20:21
Však ono půjde ...
Avatar
Ori I
Člen
Avatar
Odpovídá na Jan Poláček
Ori I:24.8.2014 23:25

hej tu máš predpokladám to čo hľadáš http://www.dzone.com/…serving-html

function truncate($s, $l, $e = '...', $isHTML = false){
                $i = 0;
                $tags = array();
                if($isHTML){
                        preg_match_all('/<[^>]+>([^<]*)/', $s, $m, PREG_OFFSET_CAPTURE | PREG_SET_ORDER);
                        foreach($m as $o){
                                if($o[0][1] - $i >= $l)
                                        break;
                                $t = substr(strtok($o[0][0], " \t\n\r\0\x0B>"), 1);
                                if($t[0] != '/')
                                        $tags[] = $t;
                                elseif(end($tags) == substr($t, 1))
                                        array_pop($tags);
                                $i += $o[1][1] - $o[0][1];
                        }
                }
                return substr($s, 0, $l = min(strlen($s),  $l + $i)) . (count($tags = array_reverse($tags)) ? '</' . implode('></', $tags) . '>' : '') . (strlen($s) > $l ? $e : '');
        }
echo truncate('jo<i><b>n</b>as</i>', 3, '...'); //jo<...
echo truncate('jo<i><b>n</b>as</i>', 3, '...', true); //jo<i><b>n</b></i>...
echo truncate('jo<i><b>n</b>as</i>', 3, '...', true, false); //jo<i><b>n...

Snáď je to ono :)

PS: kód nieje môj tak ma/ho nekritizujte :D

 
Nahoru Odpovědět
24.8.2014 23:25
Avatar
Odpovídá na Jan Poláček
Neaktivní uživatel:25.8.2014 9:23
<h1>Nadpis</h1><hr><p><b>Text<b> nějaký</p><p><b>Druhý</b> text</p>

Co procházet znak po znaku a kontrolovat, zda se jedná o tag nebo ne. Pokud nepůjde o tag a znak by již neměl být zobrazen, smaže se. Například, pokud chceme zachovat prvních 8 znaků, zůstane toto (odstraní se pouze text)...

<h1>Nadpis</h1><hr><p><b>Te<b></p><p><b></b></p>

No a nakonec se poodstraňují prázdné tagy na toto:

<h1>Nadpis</h1><hr><p><b>Te<b></p>
Nahoru Odpovědět
25.8.2014 9:23
Neaktivní uživatelský účet
Avatar
Jan Lupčík
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Lupčík:25.8.2014 9:58

Jenom bych doplnil, že lepší je používat tagy < strong >, než < b >. Je to psáno nejen tady v lekcích, ale také všude jinde. :)

Editováno 25.8.2014 9:59
Nahoru Odpovědět
25.8.2014 9:58
TruckersMP vývojář
Avatar
Juraj Mlich
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Juraj Mlich:25.8.2014 10:30

To záleží na situácií. < b > narozdiel od < strong > neprideľuje textu určitý význam, čo sa v niektorých situáciách môže hodiť.

Editováno 25.8.2014 10:31
 
Nahoru Odpovědět
25.8.2014 10:30
Avatar
Pavel Mareš
Tvůrce
Avatar
Odpovídá na Jan Lupčík
Pavel Mareš:25.8.2014 11:06

Juraj Mlich má v tomto pravdu. Vyhledávače, namátkou vezmeme třeba Google :), si přidělují slovům určitý význam, podle tagů ve kterých jsou. No a představte si, že v textu chce čtenáři pouze zdůraznit jedno slovo, tak ho dáte do < strong >, ovšem vyhledávač to vezme jinak než člověk. No, představte si, že to slovo vůbec nebude patřit k vaší stránce jako takové, má jen poukázat na nějakou zkutečnost. V tom případě bych zvolil < b >, abych v tom nedělal bordel algoritmům vyhledávačů. (Jen na okraj.)

Editováno 25.8.2014 11:07
Nahoru Odpovědět
25.8.2014 11:06
Však ono půjde ...
Avatar
Odpovídá na Jan Lupčík
Neaktivní uživatel:25.8.2014 19:55

Sakra, bavíme se tu úplně o něčem jiném. Nechtělo se mi psát dlouhé strong, tak jsem napsal kratší "b". Omlouvám se, pokud vám na tom tak záleží...

Nahoru Odpovědět
25.8.2014 19:55
Neaktivní uživatelský účet
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:26.8.2014 6:44

Další možností je použít DomDocument, upravit podle potřeby a vypsat jako HTML. Stačí k tomu pouze jedna instance a usnadní to problém.

 
Nahoru Odpovědět
26.8.2014 6:44
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 15 zpráv z 15.