BBCode - Nested Quotes

eYo

Grünschnabel
Ich brauch unbedingt einen BBCode für die sogenannten Nested Quotes.

Habe bisher nur folgendes:

PHP:
$open = '<blockquote style="border: 1px solid #000000; padding: 4px;">';
        $close = '</blockquote>';

        // How often is the open tag?
        preg_match_all ('/\[quote\]/i', $str, $matches);
        $opentags = count($matches['0']);

        // How often is the close tag?
        preg_match_all ('/\[\/quote\]/i', $str, $matches);
        $closetags = count($matches['0']);

        // Check how many tags have been unclosed
        // And add the unclosing tag at the end of the message
        $unclosed = $opentags - $closetags;
        for ($i = 0; $i < $unclosed; $i++) {
                $str .= '</blockquote>';
        }

        // Do replacement
        $str = str_replace ('[ quote]', $open, $str);
        $str = str_replace ('[ /quote]', $close, $str);

Brauche allerdings auch noch eins für [ quote=nick ]text [ /quote ]

Weiß allerdings nicht wie ich das mit dem
Code:
$str = preg_replace('\[quote=(.*)\]...
umsetzen soll :/
 
Arbeite lieber mit der preg_replace()- oder preg_replce_callback()-Funktion, etwa:
PHP:
function blockquote( $input )
{
	$retVal = '<blockquote';
	if( $input[1] != '' ) {
		$retVal .= ' title="'.$input[1].'"';
	}
	$retVal .= '>'.$input[2].'</blockquote>';
	return $retVal;
}

$string = preg_replcace_callback('@\[blockquote(?:="([^"]+)")?\](.+)\[/blockquote\]@s', 'blockquote', $string);
 
Und wie binde ich das nun in die ausgabe ein?

$text = "[ quote=bla]blubb[ /quote]";

echo blockquote($text);

Ergebnis: <blockquote title="q">u</blockquote>

:(
 
Zuletzt bearbeitet:
du rufst die blockquote-Funktion nicht direkt auf, sondern sie wird als callback von preg_replace verwendet. Deswegen heißt die Funktion auch preg_replace_callback ;)

ausgehend von Gumbos Code musst du dann nur noch "echo $string;" machen.
 
Gumbo hat gesagt.:
Wie die preg_replace_callback()-Funktion funktioniert und welche Werte in welchem Format der Callback-Funktion übergeben werden, findest du alles auf der Referenzseite der preg_replace_callback()-Funktion.

Nach durchlesen von Beispiel 3. preg_replace_callback() unter Verwendung einer rekursiven Struktur um gekapselten BB-Code zu verarbeiten habe ich den code folgendermaßen geändert:

PHP:
function blockquote( $input )
{

	$regex = '@\[blockquote(?:="([^"]+)")?\](.+)\[/blockquote\]@s';
    $input = '<blockquote';
    if( $input[1] != '' ) {
        $input .= ' title="'.$input[1].'"';
    }
    $input .= '>'.$input[2].'</blockquote>';
	return preg_replace_callback($regex, 'blockquote', $input);
}

Nun mache ich folgendes:

$text = "[ quote=asdasdasdasd]text1234123[ /quote]";

echo blockquote($text);

Und ausgegeben kriege ich lediglich:

<blockquote title="b">l</blockquote>

Ist vielleicht was an deinem $regex falsch? Ich kenne lediglich die Bezeichnung (.*) :/
 
Gumbo hat gesagt.:
Hast du Sir Robins Hinweis schon berücksichtigt?


Hast du meine Antwort daraufhin gelesen?
Ich benutze dies in einem Forum, die Beiträge werden logischerweise in einer MySQL Datenbank gespeichert.
Ausrufen tue ich diesen Beitrag folgendermaßen:
PHP:
<?php echo bbcode($beitrag['text']); ?>

bbcode ist ebenfalls eine funktion in der die anderen BBCodes wie [ img] [ url] [ b] [ i] [ u] etc. definiert sind. Wie soll ich also <?php echo $string; ?> machen wenn die Funktion "blockquote" keinen $input <- hat ...Ich muss also jetzt irgendwas nach dem bbcode(...); oder vor dem bbcode(...); schreiben um die [ quote=bla]... umzuwandeln, richtig? Da bringts mir also nichts wenn ich echo $string; schreibe...
 
Pack die Verarbeitung (der Aufruf der preg_replace_callback()-Funktion) doch einfach mit in die bbcode()-Funktion.
 
Zurück