[php] skrocenie stringa do 200+ znaków

[php] skrocenie stringa do 200+ znaków
dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

Otoz, mam sobie juz spory kawalek strony, bede w nim uzywac bbcode, mam juz skrypt gotowy, tylko teraz moj problem przedstawia sie tak:
chce zeby w dziale artykuly wyswietlalo mi tytul, date itd i FRAGMENT artykulu wlasciwego.. założmy - 200 znaków.. no i zalozmy ze mamy takiego stringa (czyli tresc artykulu):

Kopiuj
$tresc = "{jakies 190 znaków}"."[b]pogrubiony text[/b]";

no i po skroceniu takiego stringa do 200 znaków wyjdzie mi cos takiego

{jakieś 190 znaków}[b]pogrubi

no i chcialbym zeby zamiast skrocic stringa do 200, skrócic go az do zamknięcia tego [/b] (z tym ze to niekoniecznie musi byc "b").. z tego co logicznie rozumuje pasuje mi tutaj zrobic cos co po przesunieciu sie o 200 znaków, "wędrowałoby" po stringu, aż znalazło by "[/" i dalej wędrowało i zatrzymało się na najbliższym "]" i zrobiło ciach! .. tylko jakos sobie tego w kodzie nie moge wyobrazic :P

jakieś pomysly?

pozdrawiam i dzieki!
~dzek69

</b>
dodekam
  • Rejestracja: dni
  • Ostatnio: dni
0

Teoretycznie można to rozwiązać za pomocą wyrażeń regularnych, jednak bezpieczniej byłoby napisać parser. O ile pojedyncze tagi da się załatwić prostymi regułkami, o tyle coś zagnieżdżonego w stylu:
[foo]... 190 znaków ...[b] foo (w tym miejscu jest 200. znak) bar [/b][/foo]
byłoby znacznym problemem - ciężko byłoby napisać regułkę, która by łapała wszystkie zagnieżdżenia.
Podrzuciłbym regułkę sprawdzającą, czy są niezamknięte tagi, ale nie potrafię napisać takiej, która by zadziałała w PHP - afair nie ma tam pewnych dodatkowych operatorów, które byłyby bardzo pomocne.
I szczerze mówiąc, najłatwiejszym rozwiazaniem takiego problemu jest po prostu pozbycie się wszystkich tagów :) s/[/?.*?]//

Kopiuj
dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

hmm.. no to nie wiem co z tym zrobic .. pasuje mi wymyslic cos madrego.. :/

nav
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

Lecisz znak po znaku, dodajesz na stos tagi otwierajace, zamykajacym zdejmujesz (nie liczysz ich do limitu), jak po 200 znakach zostanie coś na stosie, domykasz reszte, albo czytasz aż stos będzie pusty (co w przypadku niektórych tagów może być bardzo długie i utnie np po 500 znakach). Kwestia tylko, żeby tagi były poprawnie pozagnieżdżane. Wtedy trzeba stos odpada, trzeba zliczać w inny sposób i potem zamykać też odpowiednio.

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0
nav napisał(a)

Lecisz znak po znaku, dodajesz na stos tagi otwierajace, zamykajacym zdejmujesz (nie liczysz ich do limitu), jak po 200 znakach zostanie coś na stosie, domykasz reszte.

tak wlasnie pomyslalem..
jest jakas funkcja w php (mam prawo nie znac wszystkich ;p) ktora zlicza ilosc wystepowania stringa w stringu? :)

nav
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
0

http://pl2.php.net/manual/pl/function.substr-count.php Tylko nie wiem po co coś takiego, najzwyczajniejszy parser lecący znak po znaku wystarczy. Tu nie ma potrzeby do wyszukiwania czegokolwiek w tekście.

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

ok, a jak taki parser napisac ? ;p
a nie szybciej (w sensie szybkosci dzialania skryptu) byloby substr_count - em zrobic?

dodekam
  • Rejestracja: dni
  • Ostatnio: dni
0
dzek69 napisał(a)

ok, a jak taki parser napisac ? ;p
a nie szybciej (w sensie szybkosci dzialania skryptu) byloby substr_count - em zrobic?

można by w ten sposób co najwyżej sprawdzić, czy są niezamknięte tagi, a, jak już powiedziałem, to można zrobić regexpem.
jak napisać parser? toć nav już ci powiedział przecież, stos, stos, stos!

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

nie wiem co to stosy, tzn mam tylko pewne wyobrazenie, ale nie umiem sie za to zabrac..
zaraz o tym poczytam..
a wystarczy mi teoretycznie znalezienie otwartych tagow - po "urwaniu" dokleje tylko tagi zamykajace.. ale tu jest problem z zagnieżdżaniem..

edit: poczytalem ogólnie o stosach - dalej nie wiem jak sie za to zabrac ;p

Adamo
  • Rejestracja: dni
  • Ostatnio: dni
0

to nie stosuj stosu bo i tak się niezbyt tu nadaje ze względu na to że userzy często zamykają tagi w złej kolejności, tylko najzwyczajniej zrób prega z /[(.*?)]/s na substr($tytul, 0, 200) i w zwykłej tablicy asocjacyjnej zlicz ile razy coś się otworzyło, np:
$tablica[$tag] ++;, a jeśli na początku było wyłapane "/" (czyli zamknięcie) to odejmij, na końcu tekstu dodaj to co zostało na plusie tyle razy ile miało czyli

Kopiuj
foreach($tablica as $tag => $ile){
  while($ile --> 0) $tekst .= '[/' . $tag . ']'; // >0 to zabezpieczenie przed większą ilością zamknięć niż otworzeń
}

zamiast prega możesz jak wspomniano wcześniej lecieć po znaku, tyle że kod będzie mniej przejrzysty (ale i tak bardziej polecam to rozwiązanie)
po prostu zwykły for od zera do 200 i zapamiętujesz czy jesteś w tagu czy nie, jeśli tak to oczekujesz "]" i zapisujesz reszte a kiedy osiągnie "]" to to co zapisał po prostu wpisuje w tablice, jeśli nie to oczekujesz "[" i ignorujesz reszte

dzek69
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Rzeszów
0

boze, jak to czytam to sie gubie na drugim slowie.. a ja myslalem ze umiem juz duzo php .. niewazne, zrobie tyle ze pozamykam otwarte tagi w kolejnosci dowolnej, z tym ze quote/code na koncu i wystarczy .. bo to mnie przeraza

dzieki wszystkim za pomoc!

mysz
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 79
0

O ile dobrze pamiętam, to gdzies na tym forum podawałem praktycznie gotowca do skracania stringa zawierającego bbcode - poszukaj dokładnie w wątkach związanych z bbcode.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.