Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Skracanie tekstu, problem z pojawieniem się tagów html
Forum PHP.pl > Forum > Przedszkole
piotrekk
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:

  1. <?php
  2. function skrot($txt, $dlugosc_tekstu)
  3. {
  4.   if(strlen($txt) <= $dlugosc_tekstu)
  5.       return $txt;
  6.  
  7.   while($txt{$dlugosc_tekstu} != ' ' && strlen($txt) > $dlugosc_tekstu)
  8.       ++ $dlugosc_tekstu;
  9.  
  10.   $str = substr($txt, 0, $dlugosc_tekstu);
  11.  
  12.   if(strlen($txt) > $dlugosc_tekstu){
  13.       $str .= "&hellip;";
  14.   }
  15.  
  16.   return $str;
  17. }
  18. $tresc = <p>To jest tekst z oferta specjalna w celu sprawdzenia funkcjonowania funkcji skracającej tekst.</p>
  19. <ul>
  20. <li>test1</li>
  21. <li>test1</li>
  22. <li>dskaodap</li>
  23. </ul>
  24. <p>&nbsp;</p>;
  25. echo skrot($tresc, 95);
  26. ?>


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
Jak użyjesz tej funkcji, to zostanie Ci coś w stylu:
  1. <p>To jest tekst z oferta specjalna w celu sprawdzenia funkcjonowania funkcji skracającej tekst.</p>
  2. <ul>
  3. <li>test1...
Zostaną niedomknięte tagi i wszystko się posypie. Zrób
  1. <?php
  2. echo skrot(striptags($tresc), 95);
  3. ?>
piotrekk
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
on ale skoro chcesz skrócony teks to po co go ładowac ze wszystkim?
sowiq
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:
  1. <tr>
  2. <td></td>
  3. <td></td>
  4. <td></td>
  5. </tr>
  6. <tr>
  7. <td>...[tutaj się ucięło]
Ale to już pozostawiam do pogłówkowania winksmiley.jpg
piotrekk
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
  1. <?php
  2. function skracaj_text($str, $limit = 100, $end_char = '...') {  //funkcja skraca tekst o podaną liczbę słów, uwzględnia tagi html.
  3.   if (trim($str) == '')
  4.      return $str;
  5.      preg_match('/s*(?:S*s*){'. (int) $limit .'}/', $str, $matches);
  6.      if (strlen($matches[0]) == strlen($str))
  7.      $end_char = '';
  8.   return rtrim($matches[0]) . $end_char;
  9.   }
  10. ?>
- z manuala z tego co pamiętam.
erix
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
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); questionmark.gif

pozdro
Pilsener
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.