Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Problem z BBCode - zagnieżdżanie
Fafu
post
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
Go to the top of the page
+Quote Post
wookieb
post
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
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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
pozdrawiam

Ten post edytował Fafu 30.05.2009, 11:38:34
Go to the top of the page
+Quote Post
wookieb
post
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
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? (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
wookieb
post
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
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 ] ?
Go to the top of the page
+Quote Post
wookieb
post
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
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ś (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Tylko w przypadku
Kod
[quote=cos]cos[quote]sad[/quote]
jak wyświetlić jedynie ten poprawny? Hmm...
Go to the top of the page
+Quote Post
erix
post
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
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 20.09.2025 - 04:38