Diskuze: Zkrácení HTML textu
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 15 zpráv z 15.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
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...
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
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?
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.
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é.
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).
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.
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
<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>
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.
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ť.
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.)
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ží...
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.
Zobrazeno 15 zpráv z 15.