quote-Funktion bei Forum

BeaTBoxX

Erfahrenes Mitglied
Hallo zusammen,

ich hab mir ein kleines Board selberprogrammiert und hätte nun gerne eine "Zitat" Funktion integriert.

Das eintragen in den Antwort-Text in der Form



[quote=BeaTBoxX] blabalalla [/quote]



ist nicht das Problem.
Vielmehr weiss ich nicht , wie ich so einen Text durch passende Darstellung ersetzen soll, wenn das Posting dann aus der DB ausgelesen und dargestellt werden soll,
Bei einfachem Zitat könnte das auch noch gehen.
Ich hätte aber gern eine Lösung die auch verschachtelt funktioniert.
Meine Frage nun:

Wie kann ich bei einem Zitat wie diesem:



[quote=hans]
[quote=hugo]
[quote=erwin]
gebblubber
[/quote]
blabla
[/quote]
blublubb
[/quote]



Herausfinden welches quote öffnen-Tag zu welchem schliessen-Tag gehoert?

Hat da jemand nen Tip fuer mich?

Vielen Dank

Gruß
Frank


PS: Mist nun hab ichs extra in "Code" Tags geschrieben aber es wird trotzdem ersetzt =)
Naja ich denke ihr wisst, was ich meine :)
 
Zuletzt bearbeitet:
Als Idee dazu fällt mir [phpf]preg_match[/phpf], [phpf]preg_replace[/phpf], [phpf]str_replace[/phpf] bzw. [phpf]strpos[/phpf] in einer rekursiven Funktion ein.
Also eine Funktion, die nach [ quote ] sucht, sich mit dem Index des letzten Zeichens des [ quote ] selbst aufruft, bis keins mehr gefunden wird. Dann in der Funktion mit einem "not-greedy"-Regulärem-Ausdruck ab der Position [ quote ] bla [ /quote ] ersetzen. Durch die Rekursion (die Du vor dem Ersetzen aufrufst) erreichst Du, dass erst die inneren ersetzt werden.
Mit [phpf]preg_match[/phpf] sollte es auch möglich sein, zunächst ein Array mit den Anfängen des Zitats (also [ quote ]) zu erstellen und dieses rückwärts zu durchlaufen und jeweils mit dem entsprechenden Teilstring mit [phpf]preg_replace[/phpf] die Ersetzung mit einem "not-greedy"-Regulärem-Ausdruck durchzuführen.
Grundprinzip ist auf jeden Fall, einen Weg zu finden, mit dem Du das Ersetzen von hinten beginnst und dann mit Hilfe eines "not-greedy"-Regulärem-Ausdruck die zueinander passenden öffnenden und schließenden Quotes ersetzt.
Alternativ kannst Du auch die Öffnenden und die Schließenden einzeln, unabhängig voneinander, ersetzen, was jedoch bei fehlerhafter Usereingabe zu invalidem HTML-Code führt und das Layout Deiner Seite zerstören kann.

Gruß hpvw
 
Ja dachte ich auch schon , dass sich das wohl nur rekursiv machen lässt.

Wenn du mir bitte noch sagst was ein "not-greedy" (-regulärer-Ausdruck) ist ? :D

Gruß
Frank
 
Wie gesagt, es geht auch mit preg_match ohne Rekursion.
Was ich damit meine werde ich Dir nicht sagen, weil es im Reguläre-Ausdrücke-Tutorial auf Seite 2 unten und folgende viel besser beschrieben ist, als ich es jemals könnte ("interessanter Modifier U"). Das Wort habe ich, wie Du Dir sicher denken kannst, konstruiert; greedy heißt gierig. Mit der Quantifier-Kombination *? erreicht man auch für Teilausdrücke, dass diese nicht gierig sind. Ich glaube, dass steht auch irgendwo in dem Tutorial, aber ich kann es gerade nicht finden.

Das der Ausdruck nicht gierig sein soll und von hinten beginnt machen vielleicht folgende Beispiele klar:
Erster Treffer bei Gierigkeit und Beginnen von vorne (ich kürze mal ab mit [q] und [/q]):
Code:
[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]

Normaler Text

[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]
Erster Treffer bei Gierigkeit und Beginnen von hinten:
Code:
[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]

Normaler Text

[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]
Erster Treffer bei Nicht-Gierigkeit und Beginnen von vorne:
Code:
[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]

Normaler Text

[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]
Erster Treffer bei Nicht-Gierigkeit und Beginnen von hinten:
Code:
[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]

Normaler Text

[q]
Zitat
[q]
Zitat im Zitat
[/q]
Zitat Fortsetzung
[/q]
Gruß hpvw
 
Zurück