ďťż

[PHP] Zagnieżdżanie znaczników BBCode Jak konwertować później? Problem z preg_replace.

       

Podstrony


telcocafe

Najpierw przykład:[ list ] [ * ]a [ * ][ list ] [ * ]a1 [/ list ] [/ list ]I problem. Po użyciu preg_replace zamieniany jest tylko pierwszy tag [ list ]. Używam przełączników 'si'. Problem rozwiązuje kolejne wywołanie funkcji,ale ja chcę zrobić to za jednym zamachem. Jak to najlepiej rozwiązać?



yyy a może najprościej xD ?
Liczysz ile jest tych samych tagów i w pętelce odpalasz funkcję :P

http://wortal.php.pl..._parser_bb_code

Tylko poczekaj aż wortal będzie działać bo coś im się zrypało :P
Użytkownik polasek edytował ten post 31 sierpień 2007, 07:51
@polasek:
Ech,nie mogę znaleźć linku do kodów źródłowych tego artykułu . . .
@DJ_ProG:
To inaczej :)
Mam taki sobie kod do przetworzenia:[ b ]jeden[ b ]dwa[/ b ]trzy[/ b ]Teraz syntax funkcji:#\[b\](.*?)\[\/b\]#siCzy teraz bardziej zrozumiale? To jeszcze wynik:<b>jeden[ b ]dwa</a>trzy[ /b ]



No ale człowieku, możesz liczyć ilość tagów i na tej podstawie używać funcji (bądź nie), która by wybierała te same tagi - pierwszy (licząc od początku pliku) i ostatni (licząc od końca pliku).
Przecież to da się zrobić. Poza tym, zdziwiłbym się, gdybyś był jedyną osobą na świecie, mającą ten problem. Przejrzyj może gugla albo choć listingi jakiegoś większego CMSa w którym tego problemu nie ma i tyle :P

Przejrzałem źródło IPB,bo tylko do tego mam dostęp,ale nie wiem jak oni to zrobili . . . W takim razie jakim sposobem mam to liczyć - opierając się na Twoim rozwiązaniu? Ja to bym zrobił w pętli while i sprawdzał zawartość preg_match,ale dla każdego znacznika to zbyt duże obciążenie . . .

Jakieś inne metody niż liczenie są, ale trzebaby pokombinować :P
Poza tym, oblookaj inne CMSy/fora :P

A sposób na liczenie może być np. taki (bo akurat taki wpadł mi do głowy):$a = explode('[/list]', $str); $ilosc = count($a)-1;;)

Na razie nie mam dostępu do innych systemów niż IPB,może jak znajdę jakiś dostęp do netu . . .
@up:
I co z tą liczbą teraz mam zrobić bo nie mam takiej głowy jak Ty :)
Bym to zrobił w jeszcze inny sposób używając mniej pamięciożernej funkcji - str_cośtam tylko nie pamiętam. Ale to również jest źle,ponieważ delikwent mógłby nie zamykać tagów,a wtedy parser by krążył w koło . . . Nie mam pomysłów :/ Chcę to zrobić w miarę "tanio" - bez strat serwera.

if(str_count(...)) { $zmienna = str_replace(...) }
Ewentualnie możesz użyć czwartego parametru str_replace() w PHP5, choć powyższy sposób jest lepszy.

Słuchaj, ja miałem taki pomysł, by jak napisałem wcześniej liczyć tagi. Jeśli coś nie jest zamknięte, to parser i tak tego nie przerobi. W związku z tym, warto liczyć same zamknięte tagi :P Dlatego w w/w przykładzie uwzględniłem "[/list]".
Później jak masz tą liczbę (i powołując się na Twój tekst: "Problem rozwiązuje kolejne wywołanie funkcji") w pętli odpalasz prega :P Czyli np.for ($i=1; $i<=$ilosc; $i++) preg_replace(...); :P
Użytkownik DJ_ProG edytował ten post 02 wrzesień 2007, 08:21
@Ferrari:
Ten sposób nie rozwiązuje problemu,ponieważ potrzebuję funkcji nieregularnej - obsługa różnych kombinacji znaczników, niedomkniętych znaczników . . .
@DJ_ProG:
Może nie rozumiem,ale rozpatrując Twój sposób:
Mam 10 znaczników (tylko dwa zagnieżdżone). Funkcja liczy tych 10 elementów i odpala preg_replace 10 razy zamiast dwóch.
Mam nadzieję,że dobrze zrozumiałem . . .
Ale chyba zrobię coś w tym stylu:foreach ($preg as $b) { while (preg_match()) preg_replace(); }
Użytkownik andrzej_aa edytował ten post 02 wrzesień 2007, 17:34
  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.