PHP: "useknutie" retazca obsahujuceho HTML

Programovacie jazyky, rady, poradňa...
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

PHP: "useknutie" retazca obsahujuceho HTML

Príspevok od používateľa Mek »

Zdravim, pracujem na jednom projekte, kde nacitavam z databazky text (lubovolne dlhy). Na uvodnej stranke je taky sumar, su tam posledne tri texty - uryvky z nich, kazdy v dlzke 110 znakov a potom su tri bodky.
Tento dlhy text obsahuje HTML tagy. Takze ked ho useknem po 110 znakoch, tak sa moze stat, ze ho useknem medzi tagmi, alebo dokonca odseknem cast tagu, a toto by som velmi nerad... Potrebujem teda useknut tento dlhy text tak, ze sa po 110 znakoch usekne najblizsie, kedy bude moct (tj. ukoncenie vsetkych otvorenych html tagov) a neusekne sa to ani uprostred tagu.
Skusal som to uz rozne, ale blblo mi to - mozno preto, ze pouzivam UTF-8, tak ked som prechadzal text znak po znaku, tak mi to zmrsilo diakritiku... :?

A dalsi problem, tiez tohoto sa tykajuci, je, ze ak bude text obsahovat napr. retazec "mmmmmmmmmmmmmmmmmmmmmmmm", tak sa to zobrazi tak, ako to je, a, prirodzene, narusi template. Potrebujem teda aj to, aby sa vo takychto dlhych slov kazdych, povedzme 15 znakov, vkladala medzera (aby prehliadac hodil dalsiu cast slova na novy riadok a nenarusil sa template). Tu je zase aj problem s tym, ze ako "dlhy retazec" to moze brat aj napriklad <a href="http://nejakastranka.nejakadomena/nejakapodstanka"> a tam by mi nechtiac vkladalo medzeru.
Vie niekto? (K+ za funkcne riesenie ista)
qacer
Novice
Novice
Príspevky: 3
Registrovaný: 16 apr 2007, 8:13

Príspevok od používateľa qacer »

ja pri skracovaní reťazcov použímav strip_tags() ...ale ty tam asi chces mat tie tagy :(
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

ano, chcel by som zachovat tagy B, I, U, LI, OL, UL (tak to mam spravene uz teraz, ze ak sa to usekne medzi tagmi, tak sa na koniec doplni prislusny ukoncovaci tag), ale co ak sa to usekne niekde v tagu (tj nie medzi tagmi). :(
caesar1987
Addict
Addict
Používateľov profilový obrázok
Príspevky: 3001
Registrovaný: 02 okt 2005, 0:57
Bydlisko: Nové Zámky
Kontaktovať používateľa:

Príspevok od používateľa caesar1987 »

je tu moznost pocitat "<" a ked je vacsie ako nula, tak sa nesekne

teda forciklom sa prechadza string ak je char < tak sa nejaka premenna zvasci o 1. ak je > tak sa zmeni so jedna. pritom sa do druhej premennej pocita pocet charov, ktore uz boli a ked je to napr 10, tak sa prida medzera

teda if pocitadlo< je nula a pocitadloznakov je napr <100 potom pridas medzeru, pocitadloznakov das na 0
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

vola to po zasobniku ;) az primitivne jednodue to bude
budes prechadzat retazec a budes hladat tagy. ak najdes zaciatocny ulozis do zasobnika. najdes dalsi ulozis do zasobnika. Ak najdes koncovy, vyberies zo zasobnika.
no a na konci len pridas pekne koncove tagy k tym ktore ti ostanu v zasobniku.

neparove tagy samozrejme ignorujes
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

Kód: Vybrať všetko

function textwrap($str,$chars=16,$rozdel=' ') {
	// vlozi do slov v texte $str dlhsich ako $chars znakov kazdych $chars znakov znak, resp. retazec $rozdel.
	// nepokasle to html kod, a ani entity.
	$znakovvslove=0;
	$medzitagmi=false;
	for ($i=0;$i<=strlen($str);$i=$i+1)
	{
		if ($str[$i]!=' ') $znakovvslove++; else $znakovvslove=0;
		if (($str[$i]=='<') || ($str[$i]=='&')) $medzitagmi=true;
		if (($str[$i]=='>') || ($str[$i]==';')) $medzitagmi=false;
		if ($medzitagmi) $znakovvslove=0;
		if ((($znakovvslove % $chars)==0) && (!$medzitagmi)) $newstr.=$rozdel;
		$newstr.=$str[$i];
	}
	return $newstr;
}
skusal som to takto (dal som tam aj podmienku pre entity), ale niektore medzery mi to zdvojilo a ked ten upravovany text bol len jeden dlhy retazec typu "mmmmmmmmmmmmmmm", tak ho to vobec neuseklo :(
//edit: 2 mastermind: zasobnik v php? o tom som naposledy pocul ked som mal pascal :lol: tak to neviem ako by sa dalo realizovat...
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

zasobnik v php? jednoducho. bud to zaobalis do triedy, alebo budes priamo pouzivat pole a funkcie array_pop() a array_pad();
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

konecne zaujimava tema v tejto sekcii a nikto nic? ach jo.
tak teda pridam nejake riesenie.
Je to pisane pre PHP 5. ak mate verziu 4 vas problem, podporujem projekt go PHP 5
//edit: tu vyslednu triedu treba samozrejme prest a osetrit chybove stavy....
Prílohy
wrapper.zip
(1.41 KiB) 46 stiahnutí
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

thx 2 mastermind, odskusam a dam vediet ASAP :)
Mek
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4661
Registrovaný: 23 mar 2005, 23:00
Bydlisko: ZA <-> TN
Kontaktovať používateľa:

Príspevok od používateľa Mek »

nuz, ked som ten moj html vystup prehnal tym textwrapperom, tak mi to useklo prvykrat celkom dobre (mohlo to byt po cca 200 znakoch, uz si nepamatam), a druhy krat to useklo hned po prvom slove (ktore bolo obalene tagom B pre tucne pismo) a treti krat to vratilo prazdny retazec. Dlzku useknutia som nastavil na 110 znakov, ako predtym. A haluz je, ze aj ked som tam dal 300, vysledok sa vobec nezmenil :roll:
Ale neva, asi sa na to fakt vykaslem a necham tam take riesenie, ako mam teraz, alebo este lepsie, pouzijem strip_tags a bude pokoj (ze ma to predtym vobec nenapadlo). Mastermindovi posielam Kaplus, tema ukoncena :wink:
mastermind
VIP
VIP
Používateľov profilový obrázok
Príspevky: 4810
Registrovaný: 09 feb 2005, 13:17

Príspevok od používateľa mastermind »

problem bude zrejme v tom ze tam mas vela whitespacov,
skus si len vypisat prvych 200 znakov toho retazca
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Mek napísal:...
Vyzerá to tak, že sa najskôr odsekne potrebná dĺžka a potom sa už iba dá pozor na to, aby to nebolo odstrihnuté v strede tagu. Tebe by asi viac vyhovovalo, keby sa počítali iba zobrazené znaky.

PS: Neviem, či je dobrý nápad rozdeľovať aj vnorené tagy, ale ten skript asi nie je určený na delenie takých dát (a je to tam iba ako ukážka, že to funguje).
Napísať odpoveď