Poprawka BBCode.

Przed wczoraj, kiedy dodawałem notkę odnośnie funkcji skracające zorientowałem się że moja funkcja BBCode dla tagów php jest lekko kulawa. Okazało się, że kolorowanie każdej lini po kolei nie jest dobrym rozwiązaniem. Przy lini typu:
/**
Nie wyświetlało jej, ponieważ było brane do kolorowania A jak wiadomo taki kod jest błędny, bo nie ma zakończenia komentarza przed końcem kodu php. Byłem zmuszony porzucić wygodne rozwiązanie na liście i rozwiązać to w inny sposób.

Jako że kiedyś spotkałem się z wstawianiem numerków linii jako obrazków numerowanie przestało być problemem, jedynie wystarczyło opatrzyć to wszystko ładnie w kod i działa, nawet poprawnie ze standardami. W tej części opisze to co opisywałem dwa dni temu. Otóż pisałem wtedy o funkcji skracającej/łamiącej długie wyrazy. Funkcja przydająca się przy długich urlach - jak choćby googlowski kalendarz, ale nie tylko bo również przy komentarzach. Czasami trafiają się boty, bądź złośliwcy wstawiający tasiemce, które czasami rozwalają stronę.

Idea ogólnie jest bardzo prosta, przyjmuje trzy parametry:

  • tekst
  • ilość znaków, po której ma uciąć/złamać
  • bool (true/false) - czy ma skrócić czy złamać tekst

Moje rozwiązanie:

  1.  /**
  2. * Funkcja skracająca/łamiąca długie wyrazy
  3. *
  4. * @param string tekst
  5. * @param int ilość znaków
  6. * @param bool łam/skróć
  7. * @return string poprawiony - skrócony/złamany tekst
  8. */
  9.  
  10. function wrap($tekst, $znakow = 60, $lam = true)
  11. {
  12.         $podziel = explode(' ', $tekst);
  13.         $nowy = '';
  14.        
  15.         for($i = 0; $i < count($podziel); $i++)
  16.         {
  17.  
  18.                 if( strlen($podziel[$i]) >= $znakow )
  19.                 {
  20.                         if( $lam == true )
  21.                         {
  22.                                 $nowy .= ' ' . wordwrap( $podziel[$i], $znakow, '<p style="margin:0; padding: 0;"></p><strong style="color: red;">&gt;</strong>',1 );
  23.                         }
  24.                         else
  25.                         {
  26.                                 // Zabezpieczenie przed powtórzeniem końca
  27.                                 if( ( strlen($podziel[$i]) - strlen( substr($podziel[$i], 0, $znakow) ) ) > 4 )
  28.                                 {
  29.                                         $nowy .= ' ' . substr($podziel[$i], 0, $znakow) . '<strong style="color: red;">(...)</strong>' . substr($podziel[$i], strlen($podziel[$i])-4);
  30.                                 }
  31.                                 else
  32.                                 {
  33.                                         $nowy .= ' ' . substr($podziel[$i], 0, $znakow) . '<strong style="color: red;">(...)</strong>' . substr($podziel[$i], strlen($podziel[$i])-( strlen($podziel[$i]) - strlen( substr($podziel[$i], 0, $znakow) ) ) );
  34.                                 }
  35.                         }
  36.  
  37.                 }
  38.                 else
  39.                 {
  40.                         $nowy .= ' ' . $podziel[$i];
  41.                 }
  42.  
  43.         }
  44.  
  45.         return $nowy;
  46. }

Wywołanie:

  1. echo wrap('qwertyuiopasdfghjklzxcvbnm0123456789',23,true); // złam napis po każdym 23 znaku
  2. echo wrap('qwertyuiopasdfghjklzxcvbnm0123456789',23,false); // wytnij znaki od 23 do 4 od końca.

Wynik:

  1. qwertyuiopasdfghjklzxcv
  2. >bnm0123456789
  3.  
  4. qwertyuiopasdfghjklzxcv(...)6789