Dá sa to. Ak je to vstup od používateľa, ktorému nemôžeš dôverovať, tak to treba ošetriť na strane servera. Myslím, že najlepšie bude to prejsť pekne zľava doprava, pamätať si v zásobníku zoznam otvorených elementov a postupne pričítavať k nejakému počítadlu počet prejdených znakov. Keď počítadlo dosiahne maximálnu dĺžku, uzavrieš tagy, ktoré máš v zásobníku a skončíš. Keď prejdeš cez začiatočný tag, dáš ho do zásobníka a k počítadlu pričítaš aj počet znakov potrebných na jeho uzavretie. Keď prejdeš cez koncový tag, tak ho zo zásobníka odstrániš (musí sa rovnať tomu, čo je na vrchu zásobníka, v opačnom prípade ho z výsledného reťazca odstrániš).
Čiže napr. ak chceme skrátiť text <p>0123456789</p> na 10 znakov, tak by mal výsledok byť <p>012</p>. Dosiahnuť by sa to malo nejako takto:
1. prečíta sa začiatočný tag <p>, počítadlo sa zvýši o jeho dĺžku (3) plus miesto na jeho uzavretie (4), do zásobníka sa dá p; v počítadle teda bude 7.
2. prečíta sa text, z ktorého sa ale zoberú iba 3 znaky, pretože inak by sme prekročili limit; počítadlo dosiahne maximálnu dĺžku 10.
3. uzavrú sa tagy podľa zásobníka.
Text 012345<p>67890</p> sa skráti iba na 012345, pretože <p> a </p> by sa tam už nevošlo.
Predpokladám, že máš zoznam povolených značiek (môžu tam byť aj atribúty?), aby tam niekto nemohol vložiť element script. Ešte môžeš vytvoriť nejaké pravidlá, ako môžu tagy byť v sebe vnorené (aby sa nedalo dať ul do p a pod.). Keď prejdeš cez znak <, >, & alebo " a ten znak nebude tvoriť tag alebo entitu (na tie treba tiež myslieť), tak ho musíš zakódovať.
Snáď by to tak nejako mohlo fungovať.