piotrekk
27.05.2009, 12:06:39
Witam,
mam problem ze skróceniem tekstu pobieranego z bazy danych. Nie wiem czemu jak pojawiają się tagi html m.in <ul>. <li> itd. to funkcja odpowiedzialna za skracanie tekstu nie działa.
O to funk:
<?php
function skrot($txt, $dlugosc_tekstu)
{
if(strlen($txt) <= $dlugosc_tekstu) return $txt;
while($txt{$dlugosc_tekstu} != ' ' && strlen($txt) > $dlugosc_tekstu) ++ $dlugosc_tekstu;
$str = substr($txt, 0
, $dlugosc_tekstu);
if(strlen($txt) > $dlugosc_tekstu){ $str .= "…";
}
return $str;
}
$tresc = <p>To jest tekst z oferta specjalna w celu sprawdzenia funkcjonowania funkcji skracającej tekst.</p>
<ul>
<li>test1</li>
<li>test1</li>
<li>dskaodap</li>
</ul>
<p> </p>;
?>
Funkcja działa poprawnie tylko do momentu zakończenia pierwszego zdania. Później jak natrafi na <ul> wariuje i wyświetla wszystko do końca.
Czy ktoś zna rozwiązanie?
thx
sowiq
27.05.2009, 12:11:28
Jak użyjesz tej funkcji, to zostanie Ci coś w stylu:
<p>To jest tekst z oferta specjalna w celu sprawdzenia funkcjonowania funkcji skracającej tekst.
</p>
Zostaną niedomknięte tagi i wszystko się posypie. Zrób
<?php
echo skrot
(striptags
($tresc), 95
); ?>
piotrekk
27.05.2009, 12:14:59
sęk w tym że ja nie chce usunąć tych znaczników, ponieważ tekst musi ładować się w odpowiedniej formie, czyli z wypunktowaniem itd.
jak użyje strip_tags to usuwa mi wszystko i zostaje tylko ciąg znaków....
Lion_87
27.05.2009, 12:21:19
on ale skoro chcesz skrócony teks to po co go ładowac ze wszystkim?
sowiq
27.05.2009, 12:23:22
No to jedynym rozwiązaniem jest podomykanie otwartych tagów. Masz obcięty tekst i idąc od początku zbierasz otwarte tagi (robisz sobie
kolejkę lifo). Napotykając tagi zamykające zbierasz ze stosu po kolei tagi otwierające. Jak już dojdziesz do końca tekstu to zdejmujesz ze stosu pozostałe tagi dopisując ich zamknięcia.
Musisz przy tym pamiętać o takich tagach jak <br />, <img />, które nie mają domknięcia.
Problemem może być też np. taka sytuacja:
<td>...[tutaj się ucięło]
Ale to już pozostawiam do pogłówkowania
piotrekk
27.05.2009, 12:30:31
powiem Ci, że teraz to dorzuciłeś do pieca;-) , nie wiem jak za to się cholera zabrać....
Wiem jakie mogą występować tam znaczniki: <ul> <li> <p> <u> i zamknięcia do nich. innych nie będzie...
Pilsener
27.05.2009, 12:33:32
<?php
function skracaj_text($str, $limit = 100, $end_char = '...') { //funkcja skraca tekst o podaną liczbę słów, uwzględnia tagi html.
return $str;
preg_match('/s*(?:S*s*){'. (int
) $limit .'}/', $str, $matches); $end_char = '';
return rtrim($matches[0
]) . $end_char; }
?>
- z manuala z tego co pamiętam.
erix
27.05.2009, 12:34:02
Chodzisz po kodzie pregiem, który liczy tagi. Otwarcie -> licznik tagu +1, zamknięcie -> -1. I jeśli osiągnie koniec, liczysz, który licznik jest >0 - wówczas dopisujesz odpowiednie zamknięcia wg kolejności wystąpień.
A najlepiej zrób tak, jak jest w innych CMS-ach - osobne pole na zajawkę i osobne na resztę treści.
piotrekk
27.05.2009, 13:13:14
Pilsner powiem szczerze, że u mnie ta funkcja nie działa, albo bynajmniej nie wiem jak z niej skorzystać.
Możesz podać przykład wywołania tej funkcji ?
rozumiem, że mam ją wywować tak : echo skracaj_text($tresc);

pozdro
Pilsener
27.05.2009, 13:50:33
Acha, sorry - źle zrozumiałem problem. Myślałem, że ucina Tobie w środku słów i tagów, a Tobie chodzi po prostu o podomykanie wszystkich tagów?
Ciężka sprawa, bo jeśli wchodzą w grę wszystkie tagi, to skąd ma być wiadomo, jakie jest ich poprawne zamknięcie? Jak masz jakieś tabele + divy + nie wiadomo co jeszcze - niewykonalne.
Co się nasuwa:
1. Tekst trzymany w bazie bez tagów html, formatujemy dopiero przy wyświetlaniu (bbcode)
2. Wyświetlany fragment dokumentu HTML oczyszczony z tagów HTML
3. Dzielenie tekstu tylko po niektórych tagach (np. <p>)
4. Wstawienie specjalnego znaku podziału i dzielenie ręczne (np. wstawiamy {podzial} i od tego miejsca tekst nie będzie wyświetlany w formie skróconej)
W sumie nie napisałeś, do czego jest Ci to potrzebne - można się pokusić o jakiś kombajn do domykania tagów ale pewnie będzie to zżerało niemało zasobów, moim zdaniem nie tędy droga.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.