logo
28.07.2019 02:12
1
Zdravím.

Řeším následující problém: dostanu kus HTML kódu, který mám za úkol zleva oříznout, tj. získat z něj prvních např. X znaků textu (ne kódu) a zobrazit ho (a přilepit za něj "...", pokud to pokračuje).
Dané HTML většinou otevírá několik divů a paragrafů, spanů atd., pak teprve následuje nějaký text.
Zajímá mě, jak (pokud možno jednoduše, efektivně, elegantně) tento kód ošetřit tak, aby:
- všechny otevřené tagy (v okamžiku dosažení limitu) byly ve správném pořadí zavřeny
- v případě, že je kód uříznut uprostřed tagu nebo html entity, nebyly vypsány

Napadají mě spatra nějaká řešení...
- získat z kódu regexem i s pozicemi všechny tagy a tak to procházet
- přistupovat k html v DOMu, do kterého ho nejdřív převedu
...ale přijde mi to jako problém, který téměř určitě někdo přede mnou už musel řešit, a tak se ptám, pokud to vyřešil, jak se k takovému řešení dostanu.

Díky moc.
28.07.2019 07:32
2
Jako chtělo by to znát kontext. Napadá mě víc věcí a nedokážu si to 100% představit. Můžeš dát přímou ukázku?
28.07.2019 09:59
3
A potrebujes vubec ten html kod, kdyz mas vytahovat text a dopsat ... ?

Pak by stacilo totiz odstranit vsechny html tagy a text ti vyleze sam (https://php.net/strip-tags), ten oriznes a je to.
28.07.2019 10:01
4
Kód:
$text = mb_substr(trim(strip_tags($html)),0,100).'...';
28.07.2019 10:03
5
Tak pokud nepotřebuje html je to snadný. Ale já to pochopil tak že to html potřebuje.
28.07.2019 10:19
6
Když generuješ za část textu tři tečky, předpokládám, že to bude pro zobrazení na frontendu.

Nemůžeš to řešit přes CSS (text-overflow: ellipsis;)? Tím by ses vyhnul té potřebě řešit uzavírání useknutých HTML tagů.

Případně tady v té Stackoverflow odpovědi jsou odkazy na funkční víceřádkové řešení - https://stackoverflow.com/a/33061059/1693192 (ať už přes čisté CSS nebo přes JS pluginy).
28.07.2019 10:22
7
Původně odeslal Doctore97
Tak pokud nepotřebuje html je to snadný. Ale já to pochopil tak že to html potřebuje.
GitHub - dhngoc/php-cut-html-string: PHP Cut HTML String with limit character
28.07.2019 12:10
8
nice, neznal jsem, díky

Původně odeslal Petr Hejda
Když generuješ za část textu tři tečky, předpokládám, že to bude pro zobrazení na frontendu.

Nemůžeš to řešit přes CSS (text-overflow: ellipsis;)? Tím by ses vyhnul té potřebě řešit uzavírání useknutých HTML tagů.

Případně tady v té Stackoverflow odpovědi jsou odkazy na funkční víceřádkové řešení - https://stackoverflow.com/a/33061059/1693192 (ať už přes čisté CSS nebo přes JS pluginy).
Elipsis je k ničemu. Musíš znát přesný rozměry, v praxi jsem to párkrát zkoušel, ale je to nepoužitelný. Pokud fakt potřebuje jen čistý text, tak jak psali výše - strip_tags a ddoat mezeru s třema tečkama (resp výpoustkou).
28.07.2019 20:50
9
Díky moc všem za odpovědi.

@Doctore97: Můžeš dát přímou ukázku?
Příklad:
Kód:
<section>
  <div class="container">
    <p>Lorem ipsum dolor <span>s&igrave;t</span> amet consectetuer fringilla Donec interdum at Mauris.
    </p>
    <p>Id Morbi In elit nibh a Curabitur a justo consequat tempus.</p>
  </div>
  <p>Nam tellus ullamcorper vitae Nunc tincidunt a mattis quam dictum Sed.</p>
</section>
zkrácený na 20 znaků textu bude:
Kód:
<section>
  <div class="container">
    <p>Lorem ipsum dolor <span>s&igrave;</span>
    </p>
  </div>
</section>
Nebo, alternativně, i bez té poslední entity. (Indentace může být zachována či nemusí.)

@Petr Hejda: text-overflow:ellipsis;
I v daném odkazu na Stack Overflow výpustka funguje jen pro první řádek.

@qye: GitHub - dhngoc/php-cut-html-string
Také jsem neznal - kouknu na to. Vypadá to, že by to mohlo být přesně to, co chci.
(Letmým zkouknutím kódu to vypadá, že to autor řeší přes regulární výrazy)
28.07.2019 21:51
10
Zkracovat HTML/XML jde pomocí DOMDocumentu, do kterého se naloaduje useknuté html a ignoruji se interní chyby. DOMDocument uzavře tagy a výstup je pak validní. Validuju tak HTML content z editoru v CMS. Pokud je třeba zkrátit texty, pak se jen projedou txt nody, které se ořežou.