ďťż

[PHP]System newsów - automatyczne skracanie newsa

       

Podstrony


telcocafe

Piszę system newsów i chcę by gdy news wyświetlany był na stronie głównej, to był ucinany - powiedzmy po 400 znakach, ale tak, żeby nie ciął w połowie znaczników HTML lub BBCODE. Bo przypuśćmy, ze w okolicach 400 znaków będzie takie oto coś -
costam costam <a href  //ciach - 400 znak// ="costam.html"> To wtedy w fragmencie na stronie głównej będziemy mieli costam costam <a href , co oczywiscie nie jest dopuszczalne.

Nie mam pomysłu jak sie za to zabrać. Czy może ktoś z Was naprowadzić mnie na rozwiązanie?
Użytkownik Mathew edytował ten post 28 czerwiec 2006, 09:08


Szukasz w newsie znaku "<" lub ">" (zależy, gdzie chcesz uciąć: po znaczniku, czy przed). Potem wyświetlasz do tego znaku ;)
//
Szukasz od końca...
//
Jednak nie. Pomyślałem i wyszło: musisz się pobawić w szukanie... W FAQ zamieściłem kilka funkcji, które mogą się przydać... Wszystko zależy od tego, co chcesz osiągnąć :)
Użytkownik pbnan edytował ten post 28 czerwiec 2006, 10:34
No poradziłem sobie z samymi znacznikami i ucinam w dobrym miejscu. Natomiast mam teraz inny algorytmiczny kłopot.

Chciałbym, aby ten news był ucinany po 600 znakach, ale takich, które będą widoczne dla uzytkowniika czyli bez tagów. Oczywiście można zrobić strip_tags i tagów nie ma, wtedy policzy sie znaki i zwróci miejsce w ciągu, w którym winno się uciąć. No mamy pozycję, ale samych słów, bez tagów. Jak zrobić tak, zeby po 600 znakach tekstu, ale żeby wepchać tam tagi?

może podpatrz jakiś system newsów?? Ja polecam PS News



masz tu wyciek z Freez'a :]

/** * Skrócenie stringa * * Obcina stringa do danej ilośc znaków i dodaje na końcu `...` * * @param  string  $string  Tekst do obcięcia * @param  integer $length  Dopuszczalna długość * @param  string  $etc   Wstawiane znaki na końcu * @return  string Obcięty napis * @access private **/ private function obetnij( $string, $length = 80, $etc = '...',                                  $break_words = false, $middle = false ) {  if( $length == 0 )   return '';     if( strlen( $string ) > $length )  {      $length -= strlen( $etc );         if( !$break_words && !$middle )             $string = preg_replace( '/\s+?(\S+)?$/', '', substr( $string, 0, $length+1 ) );   if( !$middle )             return substr( $string, 0, $length ).$etc;   else             return substr( $string, 0, $length / 2 ).$etc.substr( $string, -$length / 2 );     }  else         return $string; }

Co jak co ale wyrażeń regularnych to ja nie kumam.. :D Jakbyś mi powiedział co oznacza '/\s+?(\S+)?$/' to byłoby mi łatwiej to jakoś zmodyfikować, na me potrzeby. Bo jak na razie to Twa funckja ucina mi tekst, ale nawet jeśli jest to środek tagu. Sam wykombinowałem cuś takiego: function tnij_newsa($ciag, $dlugosc) {          $short=substr($ciag, 0, $dlugosc);          $lewy=strrpos($short, '<'); //szuka ostatniego tagu otwierajacego          $prawy=strrpos($short, '>'); // szuka czy zostal on domkniety          if ($prawy<$lewy) { //nie domkniety tag          if($ciag[$lewy+1]=='/') { //jest to tag zamykający, więc pozwalamy na jego skończenie                   $zamkniecie=strpos($ciag, '>', $lewy);                   $short=substr($ciag, 0, $zamkniecie+1);          }          else $short=substr($ciag, 0, $lewy-1); //nie pozwalamy na rozpoczecie nowego tagu          }           return $short; }I ta funkcja ładnie ucina mi tekst bez tagów.

Ale mi chodzi o to by strip_tags($ciag)=$dlugosc, czyli tylko to co wyświetlone (sam tekst). I nie wiem jak zrobić tak, by znaleść to miejsce w ciagu, w ktorym sam tekst ma daną długość.


Co jak co ale wyrażeń regularnych to ja nie kumam.. :D
http://4programmers....lar_Expression)
Dość dobry artykuł.


http://4programmers....lar_Expression)
Dość dobry artykuł.


Co jak co ale wyrażeń regularnych to ja nie kumam.. :D Jakbyś mi powiedział co oznacza '/\s+?(\S+)?$/' to byłoby mi łatwiej to jakoś zmodyfikować, na me potrzeby. Bo jak na razie to Twa funckja ucina mi tekst, ale nawet jeśli jest to środek tagu. Sam wykombinowałem cuś takiego: function tnij_newsa($ciag, $dlugosc) {          $short=substr($ciag, 0, $dlugosc);          $lewy=strrpos($short, '<'); //szuka ostatniego tagu otwierajacego          $prawy=strrpos($short, '>'); // szuka czy zostal on domkniety          if ($prawy<$lewy) { //nie domkniety tag          if($ciag[$lewy+1]=='/') { //jest to tag zamykający, więc pozwalamy na jego skończenie                   $zamkniecie=strpos($ciag, '>', $lewy);                   $short=substr($ciag, 0, $zamkniecie+1);          }          else $short=substr($ciag, 0, $lewy-1); //nie pozwalamy na rozpoczecie nowego tagu          }           return $short; }I ta funkcja ładnie ucina mi tekst bez tagów.

Ale mi chodzi o to by strip_tags($ciag)=$dlugosc, czyli tylko to co wyświetlone (sam tekst). I nie wiem jak zrobić tak, by znaleść to miejsce w ciagu, w ktorym sam tekst ma daną długość.


Znów to samo:
Fatal Error SQL Error SQL Layer MySQL SQL Error Can't open file: 'coyote_search_cache.MYI' (errno: 145) (1016) Error Message SQL query failed SQL Query Query Number 0

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.