Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Problem z BBCode - zagnieżdżanie
Forum PHP.pl > Forum > Przedszkole
Fafu
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
wookieb
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.
Fafu
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
wookieb
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.
Fafu
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
wookieb
Najpierw zrób a potem zobaczymy czy dobrze i ewentualnei coś poprawimy.
Fafu
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 ] ?
Fafu
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...
erix
str_replace" title="Zobacz w manualu PHP" target="_manual na bękarty. ;p
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.