Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Skracanie tekstu, problem z pojawieniem się tagów html
piotrekk
post
Post #1





Grupa: Zarejestrowani
Postów: 123
Pomógł: 2
Dołączył: 13.11.2006

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
piotrekk
post
Post #3





Grupa: Zarejestrowani
Postów: 123
Pomógł: 2
Dołączył: 13.11.2006

Ostrzeżenie: (0%)
-----


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....
Go to the top of the page
+Quote Post
Lion_87
post
Post #4





Grupa: Zarejestrowani
Postów: 850
Pomógł: 120
Dołączył: 15.02.2007
Skąd: Łódź

Ostrzeżenie: (10%)
X----


on ale skoro chcesz skrócony teks to po co go ładowac ze wszystkim?
Go to the top of the page
+Quote Post
sowiq
post
Post #5





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
piotrekk
post
Post #6





Grupa: Zarejestrowani
Postów: 123
Pomógł: 2
Dołączył: 13.11.2006

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
Pilsener
post
Post #7





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
erix
post
Post #8





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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.
Go to the top of the page
+Quote Post
piotrekk
post
Post #9





Grupa: Zarejestrowani
Postów: 123
Pomógł: 2
Dołączył: 13.11.2006

Ostrzeżenie: (0%)
-----


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); (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)

pozdro
Go to the top of the page
+Quote Post
Pilsener
post
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 04:26