BBCODE hilfe

X-Gamer

Grünschnabel
Ich habe das jetzt für zitat so gemacht!!
PHP:
$patterns = array('`\[quote=(.+?)\](.+?)\[/quote\]`is');
$replaces = array('<div align="left"><blockquote>Zitat von \\1<div align="left" style="background-color:#FFFFFF; border: 1px solid #000">\\2</div></blockquote></div>');
$string = preg_replace($patterns, $replaces , $input);

aber wenn jemand ein zitat im zitat macht geht das nicht wie kann ich das ändern damit das immernoch t

MfG X-Gamer
 
Was geht denn nicht?

Liegt es vielleicht daran, dass man <blockquote> nicht verschachteln kann?
 
Versuch doch einfach für das DIV einen block als CSS zuzuweisen

Sollte klappen!

Den soweit mr bekannt ist kann man blockquote nicht verschachteln
 
Folgendes ist zwar etwa komplizierter, dafür funktioniert es aber:
PHP:
$str = '[ quote=foo][ quote=bar]foobar[ /quote][ /foobar]';

$openTags = array();
$error = false;
$parts = preg_split('/(\[.+?\])/s', $str, -1, PREG_SPLIT_DELIM_CAPTURE ^ PREG_SPLIT_NO_EMPTY);
$return = array();
while( $part = array_shift($parts) ) {
	if( preg_match('@\[([a-zA-Z]+)(?:=(.+?))?\]@', $part, $match) ) {
		$tagName = strtolower($match[1]);
		$tagAttr = $match[2];
		$openTags[] = $tagName;
		switch( $tagName ) {
			case 'quote':
				if( !empty($tagAttr) ) {
					$return[] = '<div>Zitat von <cite>'.htmlspecialchars($tagAttr).'</cite>:<blockquote>';
				} else {
					$return[] = '<div>Zitat:<blockquote>';	
				}
				break;
		}
	} else if( preg_match('@\[/([a-zA-Z]+)\]@', $part, $match) ) {
		$tagName = strtolower($match[1]);
		if( ($lastOpenedTag = end($openTags)) && $lastOpenedTag !== $tagName ) {
			$error = true;
			echo 'Error: Document not wellformed! Unexpected end tag for tag "'.$tagName.'" which is not open.';
			break;
		}
		array_pop($openTags);
		switch( strtolower($tagName) ) {
			case 'quote':
				$return[] = '</blockquote></div>';
				break;
		}
	} else {
		$return[] = htmlspecialchars($part);
	}
}
if( $error === false ) {
	echo '<pre>'.htmlspecialchars(join('', $return)).'</pre>';
}
Noch besser wäre es alles Zeichen für Zeichen durchzugehen, dann kann auch der genaue Ort eines Fehlers genannt werden.
 
Folgendes ist zwar etwa komplizierter, dafür funktioniert es aber:
PHP:
$str = '[quote=foo][/foobar]';

$openTags = array();
$error = false;
$parts = preg_split('/(\[.+?\])/s', $str, -1, PREG_SPLIT_DELIM_CAPTURE ^ PREG_SPLIT_NO_EMPTY);
$return = array();
while( $part = array_shift($parts) ) {
	if( preg_match('@\[([a-zA-Z]+)(?:=(.+?))?\]@', $part, $match) ) {
		$tagName = strtolower($match[1]);
		$tagAttr = $match[2];
		$openTags[] = $tagName;
		switch( $tagName ) {
			case 'quote':
				if( !empty($tagAttr) ) {
					$return[] = '<div>Zitat von <cite>'.htmlspecialchars($tagAttr).'</cite>:<blockquote>';
				} else {
					$return[] = '<div>Zitat:<blockquote>';	
				}
				break;
		}
	} else if( preg_match('@\[/([a-zA-Z]+)\]@', $part, $match) ) {
		$tagName = strtolower($match[1]);
		if( ($lastOpenedTag = end($openTags)) && $lastOpenedTag !== $tagName ) {
			$error = true;
			echo 'Error: Document not wellformed! Unexpected end tag for tag "'.$tagName.'" which is not open.';
			break;
		}
		array_pop($openTags);
		switch( strtolower($tagName) ) {
			case 'quote':
				$return[] = '</blockquote></div>';
				break;
		}
	} else {
		$return[] = htmlspecialchars($part);
	}
}
if( $error === false ) {
	echo '<pre>'.htmlspecialchars(join('', $return)).'</pre>';
}
Noch besser wäre es alles Zeichen für Zeichen durchzugehen, dann kann auch der genaue Ort eines Fehlers genannt werden.

THX es t ich musste es nur ein bisschen verändern damit es bei mir auch get hat!!

Aber THX!

MfG X-Gamer
 
Zurück