Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Wyświetlanie fragmentu treści, troche inaczej
Forum PHP.pl > Forum > PHP
ZeTu
Witam
Mam taki problem, że wyświetlam fragment tekstu w następujący sposób:
  1. $tresc = substr("$tresc", 0, 250);

Czyli u mnie to są 3 linijki w div i na końcu jeszcze jest "[...]" (w tej 3 linijce). Ale jeśli w tych pierwszych 250 znakach jest np. jakiś link, czy inna treść, to wyświetla więcej lub mniej. Czyli po napisaniu 2 lub więcej artykułów nie wyświetlają się po równo i nie wygląda to ładnie.
A jak zrobić by wyświetlało tekst na szerokość tego diva i na 3 linijki, po czym w 3 linijce ucinało by 6 znaków czyli " [...]" (ze spacją i jako link do całości treści).
Prosiłbym o pomoc.
Z góry THX.
sebastian.rozmus
Możesz pozbyć się linków poprzez strip_tags
ZeTu
I nic długość się nie zmieniła.
Chodzi mi żeby zawsze było równo, bez względu jaką mamy treść w div
sebastian.rozmus
Po pierwsze zapis typu $tresc = substr("$tresc", 0, 250); jest niezbyt ciekawy. Dając zmienną w cudzysłowiu sprawiasz, że to co w nim jest przechodzi przez parser więc tracisz na czasie. Spróbuj tak:

  1. $tresc = substr(strip_tags($tresc), 0, 250);
ZeTu
Ale nie chodzi mi o usunięcie linków, tylko o to, żeby zawsze wyświetlało do pełnego div'a, a wyświetla raz np. 2 linijki i pół 3-ej.
maniana
PHPem nie dopasujesz wyglądu, może lepiej wykorzystaj do tego css:
Cytat
text-overflow: ellipsis;
ZeTu
Było by dobrze gdyby nie ucinało w 1 linijce tylko w 3 i na końcu zostawiało [...] jako link czyli <a ...>...</a>
sebastian.rozmus
Iterujesz każdą literkę. Zliczasz znaki, wykluczając tagi html. Jeśli długość naliczonych znaków(nie licząc tagów) będzie miała konkretną wartość to zamykasz otwarte tagi i dodajesz [...].
ZeTu
Czyli jak powinien wyglądać kod, bo nie rozumiem cię.
sebastian.rozmus
Jeśli interesuje Cię obcięcie stringu do X "faktycznych" znaków, ale włącznie z tagami html to:

Wykorzystując ten skrypt: http://snipplr.com/view/3618/

  1. function closetags ( $html )
  2.  
  3. {
  4.  
  5. #put all opened tags into an array
  6.  
  7. preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
  8.  
  9. $openedtags = $result[1];
  10.  
  11.  
  12.  
  13. #put all closed tags into an array
  14.  
  15. preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
  16.  
  17. $closedtags = $result[1];
  18.  
  19. $len_opened = count ( $openedtags );
  20.  
  21. # all tags are closed
  22.  
  23. if( count ( $closedtags ) == $len_opened )
  24.  
  25. {
  26.  
  27. return $html;
  28.  
  29. }
  30.  
  31. $openedtags = array_reverse ( $openedtags );
  32.  
  33. # close tags
  34.  
  35. for( $i = 0; $i < $len_opened; $i++ )
  36.  
  37. {
  38.  
  39. if ( !in_array ( $openedtags[$i], $closedtags ) )
  40.  
  41. {
  42.  
  43. $html .= "</" . $openedtags[$i] . ">";
  44.  
  45. }
  46.  
  47. else
  48.  
  49. {
  50.  
  51. unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
  52.  
  53. }
  54.  
  55. }
  56.  
  57. return $html;
  58.  
  59. }
  60.  
  61.  
  62. // Do powyższej funkcji z podanej strony dodajemy jeszcze funkcję:
  63.  
  64. function skracaj($str, $max=500) {
  65. $ret = '';
  66. $inTag = false;
  67. $len = 0;
  68.  
  69. for($i = 0; $i < iconv_strlen($str, 'UTF-8'); $i++){
  70. $char = iconv_substr($str, $i, 1, 'UTF-8');
  71.  
  72. if($inTag == false && $char !== '<') {
  73. $ret .= $char;
  74. $len++;
  75. } else if(!$inTag && $char == '<') {
  76. $inTag = true;
  77. } else if($char == '>') {
  78. $inTag = false;
  79. }
  80.  
  81. if(!$inTag && $len >= $max) return $ret;
  82.  
  83. }
  84. return $ret;
  85. }


a używamy tego:

  1. $str = "<div>Jakiś test jakiś tekst jakiś tekst <strong><em>Test!</em> TEEEEKST</strong> TEEEEKST <em>";
  2. $str .= "TEEEEKST</em> TEEEEKST</div>";
  3. echo closetags( skracaj($str, 40) );


PS. Piszę w utf8, aby to zadziałało w iso8859-2 trzebaby było trochę zmienić
ZeTu
A możesz zademonstrować przykład jakieś twojej stronki wykonanej z użyciem tego twojego sposobu?
sebastian.rozmus
Sam go właśnie wymyśliłem, ale dużo osób wymyśliło to wcześniej, bo jest zbyt odkrywcze. Możesz za tego pomocą ustawić na sztywno liczbę "faktycznych" wyświetlanych znaków, czyli będzie w miarę dokładnie "wypełniało diva". Ponadto funkcja którą zaporzyczyłem domknie wszystkie tagi.
ZeTu
Trochę długi ten kod, skusiłbym się, ale jest zdecydowanie za długi, a ten drugi zjada mi stronę haha.gif
sebastian.rozmus
Nie problem go skrócić:

  1. function closetags ( $html ) {
  2. preg_match_all ( "#<([a-z]+)( .*)?(?!/)>#iU", $html, $result );
  3. $openedtags = $result[1];
  4. preg_match_all ( "#</([a-z]+)>#iU", $html, $result );
  5. $closedtags = $result[1];
  6. $len_opened = count ( $openedtags );
  7. if( count ( $closedtags ) == $len_opened ) return $html;
  8. $openedtags = array_reverse ( $openedtags );
  9. for( $i = 0; $i < $len_opened; $i++ ) {
  10. if ( !in_array ( $openedtags[$i], $closedtags ) ) $html .= "</" . $openedtags[$i] . ">";
  11. else unset ( $closedtags[array_search ( $openedtags[$i], $closedtags)] );
  12. }
  13. return $html;
  14. }
  15.  
  16. function skracaj($str, $max=500) {
  17. $ret = '';
  18. $inTag = false;
  19. $len = 0;
  20.  
  21. for($i = 0; $i < iconv_strlen($str, 'UTF-8'); $i++){
  22. $char = iconv_substr($str, $i, 1, 'UTF-8');
  23. if($inTag == false && $char !== '<') {
  24. $ret .= $char;
  25. $len++;
  26. } else if(!$inTag && $char == '<') $inTag = true;
  27. else if($char == '>') $inTag = false;
  28.  
  29. if(!$inTag && $len >= $max) return $ret;
  30. }
  31.  
  32. return $ret;
  33. }


Ten drugi to jego użycie więc potrzebuje żeby przed nim zaistniał ten powyższy(który możesz wkleić w jakiś pliczek i go includować). Pozatym to że skrypt jest długi to już konsekwencja złożoności problemu i wcale taki długo nie jest. Jeszcze nie raz będziesz tworzył rozwiązania zawierające tysiące linii kodu(biblioteki, klasy itd.) więc nie możesz się tym zrażać wink.gif
japolak
rozwiązanie twojego problemu umieściłem także i na swojej stronie skracanie tekstu po określonej liczbie znaków


Wydaje mi się, iż jest to bardzo dobre rozwiązanie omijające problemy z wyświetlaniem krzaków polskich znaków jak także problemy z znacznikami html:

oto kod:

  1.  
  2. public function cut($tekst,$ile){
  3.  
  4. // pozbywam się tagów HTML z tekstu
  5. $tekst = strip_tags($tekst);
  6.  
  7. // jeśli tekst jest dłuższy od podanej ilość znaków w zmiennej $ile
  8. // wykonuje się warunek
  9. if (strlen($tekst) > $ile) {
  10.  
  11. // pierwsze skrócenie tekstu
  12. $tekst=substr($tekst, 0, $ile);
  13.  
  14. // drugie skrócenie tekstu - skraca do momentu wystąpienia ostatniej spacji w skróconym tekście
  15. // przez co nie ucina nam słów w połowie i nie wyskakują "krzaki"
  16. for ($a=strlen($tekst)-1;$a>=0;$a--) {
  17. if ($tekst[$a]==" ") {
  18.  
  19. //wyświetlenie na końcu tekstu trzech kropek
  20. $tekst=substr($tekst, 0, $a)."...";
  21. break;
  22. };
  23. };
  24. };
  25.  
  26. // zwracanie prze-formatowanego tekstu
  27. return $tekst;
  28. }


tak dla potomnych:)
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.