Avatar
Jan Poláček (johny881):

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 (johny881)
Michal Štěpánek:

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
Odpovídá na Michal Štěpánek
Jan Poláček (johny881):

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 (johny881)
Michal Štěpánek:

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š
Redaktor
Avatar
Pavel Mareš:

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
Nechci být workoholik. Bohužel někdy musíme být tím, čím nechceme.
Avatar
Odpovídá na Pavel Mareš
Jan Poláček (johny881):

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):

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
Nesnáším {}, proto se jim vyhýbám.
Avatar
Pavel Mareš
Redaktor
Avatar
Pavel Mareš:

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
Nechci být workoholik. Bohužel někdy musíme být tím, čím nechceme.
Avatar
Ori
Člen
Avatar
Odpovídá na Jan Poláček (johny881)
Ori:

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
Fredep
Redaktor
Avatar
Odpovídá na Jan Poláček (johny881)
Fredep:
<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
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
IT Man
Redaktor
Avatar
Odpovídá na Fredep
IT Man:

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  ±0 25.8.2014 9:58
Když nevíš jak dál, podá ti ruku někdo, od koho by jsi to nečekal. A tu šanci musíš přijmout!
Avatar
Juraj Mlich
Redaktor
Avatar
Odpovídá na IT Man
Juraj Mlich:

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  ±0 25.8.2014 10:30
Vždy je lepšie učiť sa z cudzích chýb, než z vlastných chýb.
Avatar
Pavel Mareš
Redaktor
Avatar
Odpovídá na IT Man
Pavel Mareš:

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  +1 25.8.2014 11:06
Nechci být workoholik. Bohužel někdy musíme být tím, čím nechceme.
Avatar
Fredep
Redaktor
Avatar
Odpovídá na IT Man
Fredep:

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
Týmová práce je důležitá proto, aby bylo možno obvinit z neúspěchu někoho jiného.
Avatar
1Pupik1989
Člen
Avatar
1Pupik1989:

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.