Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] Problem z BBCode - zagnieżdżanie
Fafu
post 30.05.2009, 11:19:21
Post #1





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Witam, mam taki kod:
  1. <?php
  2. $str = preg_replace("#[quotee=(http://)?(.*?)](.*?)[/quotee]#si", "<div class='cytat'><div class='cytat_title'><b>2 napisał:</b></div><div class='cytat_area'>3</div></div>", $str);
  3. ?>

I wszystko ładnie działa tylko jeśli się napisze kilka razy ten tag:
Kod
[quote=test][quote=test2]to jest test[/quote][/quote]

to dostaje coś takiego:
  1. <div class='cytat'>
  2. <div class='cytat_title'><b>test napisał:</b></div>
  3. <div class='cytat_area'>[quotee=test2]to jest test</div>
  4. </div>[/quotee]

Mógłby mnie ktoś naprowadzić dlaczego tak się dzieje? Dodam, że mam też inne znaczniki bbcode i np
Kod
[quote=cos][codee]kod[/codee][quote]
działa poprawnie...
pozdrawiam

ps. zmienilem na quotee bo IPB zmienialo

Ten post edytował Fafu 30.05.2009, 11:22:44


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
wookieb
post 30.05.2009, 11:24:48
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




W parserach bbcode opartych na wyrazeniach regularnych jest o wiele trudniej to obejsc.

Twoje wyrazenie dziala w ten sposob ze od ciagu [quotee]szuka najblizszego zamkniecia czyli[/quotee]

Rozwiazaniem w przypadku wyrazen regularnych jest usuniecie ? z wyrazenia. Wygladałoby to tak
Kod
"#\[quotee=(http://)?(.*?)\](.*)\[/quotee]#si"

I wtedy rekurencyjnie sprawdzać kolejne zagnieżdzenia [quote] w wyszukanym tekscie.

O wiele prostrzym rozwiązaniem jest skorzystanie z parserów nie działających na wyrażeniach regularnych.

Ten post edytował wookieb 30.05.2009, 11:36:00


--------------------
Go to the top of the page
+Quote Post
Fafu
post 30.05.2009, 11:37:53
Post #3





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Dzięki za odpowiedź. Usunięcie ? 'troche' pomogło... Teraz wyświetla się:
Kod
<div class='cytat'>
<div class='cytat_title'><b>test napisał:</b></div>
<div class='cytat_area'>[quote=test2]to jest test[/quote]</div>
</div>

Mógłbyś rozwinąć temat parserów nie działających na wyrażeniach regularnych?
Chciałem użyć twojego parsera ale potrzebuje coś małego a nie kombajn winksmiley.jpg
pozdrawiam

Ten post edytował Fafu 30.05.2009, 11:38:34


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
wookieb
post 30.05.2009, 11:44:07
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Parsery wyszukuja tagi za pomoca funkcji typu strpos.
Wycinaja z tekstu wszystkie elementy zawarte pomiedzy [] i sprawdzaja czy sa tagiem BB. Jezeli tak to je "interpretuja".
Napisałem w " ", ponieważ po drodze może wystąpić parę inny czynników.

W prostym parserze nie uzyskasz zagnieżdżeń nie przerabiając go na mały kombajnik.

Ten post edytował wookieb 30.05.2009, 11:48:38


--------------------
Go to the top of the page
+Quote Post
Fafu
post 30.05.2009, 12:32:08
Post #5





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Znalazłem rozwiązanie które działa, chociaż jest bardzo nieprofesjonalne...
Kod
// cytat z nickiem
    $str = preg_replace("#\[quote=(http://)?(.*?)\]#si", "<div class='cytat'><div class='cytat_title'><b>\\2 napisał:</b></div><div class='cytat_area'>", $str);
    $str = str_replace(array("[quote]", // zwykly cytat
                            "[/quote]"), // zamkniecie
                    array("<div class='cytat'><div class='cytat_title'><b>Cytat</b></div><div class='cytat_area'>",
                            "</div></div>"),
                    $str);

Ale jak ktoś da samo [quote ] to rozwali stronę... Więc pomyślę nad tym.. Chyba zrobie tak ze strpos jeśli znajdzie [quote ] lub [quote= i nie znajdzie [/quote ] to nic nie zrobi. Dobry plan? winksmiley.jpg


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
wookieb
post 30.05.2009, 12:38:50
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Najpierw zrób a potem zobaczymy czy dobrze i ewentualnei coś poprawimy.


--------------------
Go to the top of the page
+Quote Post
Fafu
post 30.05.2009, 12:48:41
Post #7





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Kod
if(strpos($str, "[quote]") !== false || strpos($str, "[quote=") !== false)
    {
        if(strpos($str, "[/quote]") !== false)
        {
            // cytat z nickiem
            $str = preg_replace("#\[quote=(http://)?(.*?)\]#si", "<div class='cytat'><div class='cytat_title'><b>\\2 napisał:</b></div><div class='cytat_area'>", $str);
            $str = str_replace(array("[quote]", // zwykly cytat
                                    "[/quote]"), // zamkniecie
                                array("<div class='cytat'><div class='cytat_title'><b>Cytat</b></div><div class='cytat_area'>",
                                    "</div></div>"),
                                $str);
        }
    }

To działa lecz tylko dla
Kod
[quote=stsa]tresc

dla
Kod
[quote=assad][quote]cos[/quote]

nie bardzo :/
Jakiś pomysł jak zrobić liczbę wystąpień [quote ] ?


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
wookieb
post 30.05.2009, 12:50:19
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




http://pl.php.net/manual/pl/function.substr-count.php


--------------------
Go to the top of the page
+Quote Post
Fafu
post 30.05.2009, 13:14:56
Post #9





Grupa: Zarejestrowani
Postów: 243
Pomógł: 33
Dołączył: 30.01.2008
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


Kod
if(strpos($str, "[quote]") !== false || strpos($str, "[quote=") !== false)
    {
        if(strpos($str, "[/quote]") !== false)
        {
            $quote1 = substr_count($str, "[quote]");
            $quote2 = substr_count($str, "[/quote]");
            $quote3 = substr_count($str, "[quote=");
            if($quote1 == $quote2-$quote3)
            {
                $str = str_replace(array("[quote]", // zwykly cytat
                                    "[/quote]"), // zamkniecie
                                array("<div class='cytat'><div class='cytat_title'><b>Cytat</b></div><div class='cytat_area'>",
                                    "</div></div>"),
                                $str);
            }

            if($quote3 == $quote2-$quote1)
            {
            // cytat z nickiem
            $str = preg_replace("#\[quote=(http://)?(.*?)\]#si", "<div class='cytat'><div class='cytat_title'><b>\\2 napisał:</b></div><div class='cytat_area'>", $str);
            $str = str_replace("[/quote]", "</div></div>", $str);
            }
        }
    }

Mam takie coś smile.gif
I wyświetla dla:
Kod
[quote=cos]cos[quote]sad[/quote][/quote]

W ogóle nie parsuje dla:
Kod
[quote=cos]cos[quote]sad[/quote]

[quote=cos]cos[quote]sad[/quote][/quote][/quote]

[quote=cos]cos[quote]sad

Czyli chyba wszystko działa winksmiley.jpg Tylko w przypadku
Kod
[quote=cos]cos[quote]sad[/quote]
jak wyświetlić jedynie ten poprawny? Hmm...


--------------------
http://rafal.brzezinski.me - skrypty, tutoriale i inne.
Jeśli udało Ci się rozwiązać problem podziękuj osobom, które ci pomogły.
Go to the top of the page
+Quote Post
erix
post 30.05.2009, 13:25:17
Post #10





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




str_replace" title="Zobacz w manualu PHP" target="_manual na bękarty. ;p


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 04:54