Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

[RegExp in PHP] verschachtelten BBCode ersetzen

Empfohlene Antworten

Bin gerade dabei ein Forum in PHP zu programmieren. Zur Zeit arbeite ich an einem BBCode-Handler der eigentlich ganz gut funktioniert. Allerdings hat er Probleme bei verschachtelten Tags.

An alle Perl Programmierer: Das ich in PHP programmiere macht an dieser Stelle nichts, da es primär um das Pattern geht. Also weiterlesen. ;)

Also ich habe folgenden Code um in der Threadansicht die Tags zum Zitieren zu ersetzen.


$pattern = "/(\[QUOTE\])(.*)(\[\/QUOTE\])/isU" ;
$replacement = "<p align=\"center\">
<table class=\"quotetable\">
<tr>
<td><b>Zitat:</b> \\2</td>
</tr>
</table>
</p>" ;
$this->strOutput = preg_replace( $pattern, $replacement, $this->strOutput ) ;[/PHP]

Das funktioniert, wie gesagt, schon ganz gut aber in den speziellen Fällen, dass zwei Zitate ineinader verschachtelt sind nicht. Wenn ich das /U weg lasse wird zum einen der innere Quote nicht ersetzt und zum anderen gibts dann Probleme wenn 2 Quotes hintereinander sind.

Zu dem Problem, dass der innere Quote nicht ersetzt wird habe ich in nem Perlbuch /g für global gefunden. Das kennt die PHP-Funkton aber anscheinend nicht.

Kann mir jemand helfen?

Ich hätte es jetzt so gelöst, vielleicht nicht gerade schön, aber es funzt ;)


$string = "test [QUOTE]und noch ein [QUOTE] zitat [/QUOTE] und das äussere ist zu ende [/QUOTE]";
while (preg_match("/(\[QUOTE\])(.*)(\[\/QUOTE\])/is",$string,$pregRes)) {
$replacement = "<p align=\"center\">
<table class=\"quotetable\">
<tr>
<td><b>Zitat:</b> ".$pregRes[2]."</td>
</tr>
</table>
</p>" ;
$string = str_replace($pregRes[0],$replacement,$string);
}
echo $string;
[/PHP]

Edit: Ich bemerkte gerade...da der Ausdruck "gierieg" ist, funzen zwei Quotes nebeneinander nicht, macht man ihn "nicht gierig", funzt die Verschachtelung wieder nicht richtig...

Versuche doch einen Workaround zu finden.

Arbeite mit einem Stack. Packe die geöffneten Tags rauf, erzeuge den Inhalt. Wenn du ein Schliessen-Tag findest, nimmst du das ganze runter.

Am Ende hast du dann deinen String fertig.

Edit: Ich bemerkte gerade...da der Ausdruck "gierieg" ist, funzen zwei Quotes nebeneinander nicht, macht man ihn "nicht gierig", funzt die Verschachtelung wieder nicht richtig...

Das ist geanu mein Problem.

@Enrico: Ja stimmt, das ist ne Möglichkeit. Finde ich aber eigentlich nicht so schön. Aber wenn sonst keine Ideen mehr kommen, werde ich es wohl so machen müssen.

Die Lösung aus dem PHP-Forum gefiel mir auch nicht so richtig. Ich habe jetzt die Parser-Klasse verwendet. Hat mich zwar ganz schon Zeit gekostet das Teil einzubauen (Tipp: die Callbackfunktionen funktionieren nicht mit Memberfunktionen in einer weiteren Klasse :rolleyes: ) aber jetzt läuft es und funktioniert gut.

Danke für die Hilfe.

Monty, ich wollte noch fragen, was du so machst. Ich habe gesehen, dass du in Aachen wohnst. Ich studiere dort ab diesem Wintersemester Informatik an der FH. Du studierst nicht zufällig auch, oder?

Ich hätte um ein Haar ;)

Aber dem Studium habe ich jetzt erstmal das Sammeln von Berufserfahrung vorgezogen...

Können uns ja per PM weiter unterhalten, nächstes Jahr werde ich auch in Aachen selbst wohnen.

Ich kenn aber genug, die dort studieren :)

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.