Problem mit Zitat Funktion

twisted

Mitglied
Hi,
ich habe volgendes Problem:
wenn Benutzer eine eckige Klammer in ihrem Nickname haben, werden diese nämlich mit dem Quote-Tag verwechselt.

Beispiel:
Ausgabe:
Code:
Original von ruZd[b4
]Beispiels Text
Eingabe:
Code:
[.quote=ruZd[b4]]Beispiels Text[./quote]
(Aufgrund von Darstellungsfehlern mit . geschrieben)

Code:
PHP:
<?php 
$s = preg_replace("#\[quote\=(.+)\](.*)\[\/quote]#isU", '<table width="98%" border="0" cellpadding="0" cellspacing="0" class="table_bg" align="center">
	<tr class="col_head">
		<td class="content">
			<b>Zitat:</b>
		</td>
	</tr>
	<tr class="col_cont_1">
		<td class="content">
			<i>Original von \\1</i><br />
			\\2
			</td>
		</tr>
	</table>', $s);
?>

Habe schon im Forum gesucht aber nichts gefunden ;(.
Vielleicht weis ja einer wie man dieses Problem lösen kann.
mfg. twisted
 
die einfachste variante wird sein das du vor dem preg_replace die [ und ] in einem nickname durch ein definiertes zeichen ersetzt und am schluss wieder zurückverwandelts.

es wäre mit regex wohl möglich, aber wieso so komplex wenns auch kurz und übersichtlich geht ;)
 
Ich wies jetzt nicht genau wie ich das anstellen soll :P, könntest du mir vielleicht ein beispiel geben ?

Danke schonmal für deine Hilfe :D.

mfg.
twisted
 
Hallo miteinander.
Ich hab's bei mir folgenderweise gemacht und es klappt mit eckigen Klammern im Namen, auch wenn mir \S\s merkwürdig erscheint :D

PHP:
	$patterns[] = '/\[quote=([\S\s]+)\](.*?)\[\/quote\]/si';
$replacements[] = '\\1<blockquote>\\2</blockquote>';

Gruß
Marvin
 
Danke für die schnelle Hilfe, jetzt tirtt allerdings ein anderes Problem auf, er macht jetzt den replace nur noch wenn der user ne eckigen Klammer hat :/
Beispiel: http://www.another-team-work.com/board.php?action=thread&boardid=12&id=31&amp;page=1#137

PHP
PHP:
<?php
// Zitat
if (!function_exists(bbcode_quote))
	{
	function bbcode_quote($s)
		{
		while(preg_match("/\[quote\]/isU", $s) && preg_match("/\[\/quote]/isU", $s) || preg_match("/\[quote\=/isU", $s) && preg_match("/\[\/quote]/isU", $s) || preg_match("/\[quote name\=/isU", $s) && preg_match("/\[\/quote]/isU", $s))
			{
			if (preg_match("#\[quote\=(.+)\](.*)\[\/quote]#isU", $s))
				{
				$s = preg_replace("#\[quote=([\S\s]+)\](.*)\[\/quote]#is", '<table width="98%" border="0" cellpadding="0" cellspacing="0" class="table_bg" align="center">
																								<tr class="col_head">
																									<td class="content">
																										<b>Zitat:</b>
																									</td>
																								</tr>
																								<tr class="col_cont_1">
																									<td class="content">
																										<i>Original von \\1</i><br />
																										\\2
																										</td>
																									</tr>
																								</table>', $s);
				}
			if (preg_match("#\[quote name\=(.+)\](.*)\[\/quote]#isU", $s))
				{
				$s = preg_replace("#\[quote name=([\S\s]+)\](.*)\[\/quote]#is", '<table width="98%" border="0" cellpadding="0" cellspacing="0" class="table_bg" align="center">
																										<tr class="col_head">
																											<td class="content">
																												<b>Zitat:</b>
																											</td>
																										</tr>
																										<tr class="col_cont_1">
																											<td class="content">
																												<i>Original von \\1</i><br />
																												\\2
																												</td>
																											</tr>
																										</table>', $s);
				}
			if (preg_match("#\[quote\](.*)\[\/quote]#isU", $s))
				{
				$s = preg_replace("#\[quote\](.*)\[\/quote]#isU", '<table width="98%" border="0" cellpadding="0" cellspacing="0" class="table_bg" align="center">
																						<tr class="col_head">
																							<td class="content">
																								<b>Zitat:</b>
																							</td>
																						</tr>
																						<tr class="col_cont_1">
																							<td class="content">
																								\\1
																							</td>
																						</tr>
																					</table>', $s);
				}
			}
		
		return $s;
		}
	}

?>
 
Zuletzt bearbeitet:
Hi,
ich glaube du machst dir das alles ein bisschen zu umständlich.

Ich hab's so und es funktioniert:
PHP:
function parse_bbcode($text) {
    // ...
    $patterns[] = '/\[quote=([\S\s]+)\](.*?)\[\/quote\]/si';
    $replacements[] = '\\1<blockquote>\\2</blockquote>';

    $text = preg_replace($patterns, $replacements, $text);

    return $text;
}

Gruß
Marvin
 
Ja, danke es funktioniert ja, nur bei mir funktioniert es aber nicht wenn ein user keinene ] oder [ drinne hat :(

EDIT:
Funktioniert doch, nun muss ich es nur noch hinktiegen das es verschachtelt auch funktioniert :)

mfg.
Maxcube
 
Zuletzt bearbeitet:
Hab mir das mal angeschaut und hab mir letztlich ein kleines Workaround gemacht:
PHP:
$text = preg_replace('/\[\/?([^img|quote|code|php|list|\*|b|u|i]+)\]/si', '&amp;#091;\\1&amp;#093;', $text);
Die RegExp sucht alle Strings die in eckigen Klammern stehen und wenn der String nicht img, quote, code, php, list, *, b, u oder i ist dann werden die eckigen Klammern mit den jeweiligen HTML-Entinitäten ersetzt.
© Marvin Schmidt :p

Der Beweis, dass es geht: BBCode-Demo

Nette Grüße
Marvin

P.S.: &amp; durch & ersetzen im Replacement.

Nachtrag:
Noch eine Möglichkeit:
Den Quote-Syntax wie folgt festlegen: [.quote="..."]...[/quote.] ;)
 
Zuletzt bearbeitet:
Hmmm, ist ja schön und gut nur irgendwie verstehe ich nicht wie mir das helfen kann ^^, denn dies schützt ja eigendlich nur vor falshen bbcode's :) oder ?
Könntest du mir mal bitte deinen bbcode posten damit ich mich vieleicht etwas besser darein versetzen und verstehen kann wie du das gelöst hast ?
 
Okay, Beispiel:
[.quote=Te[s]t]...[/quote.] -> Als Name wird nur Te[s gematcht, da nur zwischen dem Gleichheitszeichen und der ersten eckigen Klammer gesucht wird.

Bei meiner Methode werden alle eckigen Klammern, die nicht zu einem BBCode-Tag gehören durch die entsprechenden HTML-Sonderzeichen ersetzt:
[.quote=Te&#091;s&#093;t]...[/quote.] -> Nun wird Te&#091;s&#093;t gematcht.

Macht man es mit [.quote="Name"] macht ist es noch einfacher, da zwischen den Anführungsstrichen nach dem Namen gesucht wird und es so keine Konflikte mit den eckigen Klammern gibt.

Gruß
Marvin
 

Anhänge

Zurück