großes Chaos: BB-Code Chaos
jörg
- php
Hallo,
ich sitze gerade an ein paar scripten die Formulare enthalten in denen BB-Code implementiert sein soll.
Die Eingabe funktioniert soweit auch, allerdings macht er bei der Übersetzung des Codes in PHP grobe Fehler:
Statt [b]text[/b] in <strong>text</strong> zu übersetzen wird erst das </strong> dort gesetzt wo das letzte [/b] vorkommt.
Also statt:
[b]Fettschrift1[/b] weiterer Text ... [b]Fettschrift2[/b]
in:
<strong>Fettschrift1</strong> weiterer Text ... <strong>Fettschrift2</strong>
zu übersetzen,
tätigt er folgende Ausgabe:
<strong>Fettschrift1 weiterer Text ... Fettschrift2</strong>
Was natürlich zu groben Fehlern kommt ...
Dies ist der PHP-Code:
$fett='#([b])(.+)([/b])#is'; $text=preg_replace($fett,"<b>\2</b>",$text);
Was ist daran falsch? Bzw. wie muss es richtig aussehen?
hi,
Was ist daran falsch?
Du hast die "Gierigkeit" (engl. greediness) regulärer Ausdrücke nicht beachtet.
Bzw. wie muss es richtig aussehen?
Gewöhne deinem Suchausdruck die Gier ab.
gruß,
wahsaga
Hi jörg,
Was ist daran falsch? Bzw. wie muss es richtig aussehen?
Du hast das altbekannte Problem, dass dein Regulärer Ausdruck zu viel matched, also zu Gefräßig ist. Deshalb möchtest du hier im Archiv nach einer Lösung oder bei Google suchen und auf diesen Abschnitt des php/QuakeNet Tutorials stoßen, der genau dein Problem behandelt, erklärt und löst.
Alternativ möchtest du auch direkt eine richtige BB-Code Parserklasse benutzen, die die ganze Arbeit für dich übernimmt und der du nur noch sagen musst, welche BB-Codes behandelt werden sollen.
MfG, Dennis.
Danke für die schnelle Hilfe, nun funktionierts!
(da hab ich wohl das falsche Tutorial zu regulären Ausdrücken benutzt - da stand kein Wort davon drin :/)
hm, ich hab nun den Code geändert in:
$fett='#([b])([^[]+)([/b])#i';
Allerdings ergibt sich nun ein anderes Problem:
Die Codes sind nicht mehr verschachtelbar,
also z.B. [i][b]kuriv-fetter Text[/b][/i] ist nicht mehr möglich :(
Wie sähe denn eine Alternative aus?
Kann mir da jmd weiterhelfen?
Hi joerg,
hm, ich hab nun den Code geändert in:
$fett='#([b])([^[]+)([/b])#i';
Du hast die von mir verlinkte Seite im QuakeNet Tutorial nicht gelesen, oder? Oder wenn: Warum hast du dann nicht einfach mal die Lösung ausprobiert, die dort unter 1. steht? Auch die unter 3. würde es tun - die unter 2. ist nicht für verschachtelte BBCodes gedacht.
Allerdings ergibt sich nun ein anderes Problem:
Die Codes sind nicht mehr verschachtelbar,
also z.B. [i][b]kuriv-fetter Text[/b][/i] ist nicht mehr möglich :(
Logisch, oder? Du sagst ja mit dem RegEx oben ausdrücklich, dass erst ein [b] kommen muss, dann beliebig viele Zeichen AUßER „[“ und „]“ (und am Ende noch ein [/b])- dadurch können darin natürlich keine weiteren BB-Codes mehr kommen, weil BB-Codes ja von den eckigen Klammern umschlossen werden.
MfG, Dennis.
Du hast die von mir verlinkte Seite im QuakeNet Tutorial nicht gelesen, oder? Oder wenn: Warum hast du dann nicht einfach mal die Lösung ausprobiert, die dort unter 1. steht? Auch die unter 3. würde es tun - die unter 2. ist nicht für verschachtelte BBCodes gedacht.
Anfangs habe ich den U-Modifiert eingesetzt, allerdings wollte es nicht so ganz, weswegen ich die zweite Variante benutzt habe.
Naja gut, komischerweise funktioniert nun auch die U-Modifier (legt er da Wert auf Großschreibung ..?)
Nun hab ich allerdings ein hoffentlich letztes Problem:
Eine Anweisung formt URLS in der Form http://www.... direkt in html-links um.
Ein weiterer code sieht folgendermaßen aus:
[img=http://...]
das überschneidet sich leider, sodass erzeugt wird:
<img src='<a href='...'></a>> ...
Ich habs mit dieser Anweisung versucht:
$url='#(http://)(www.)([.a-z0-9&=#+%-]+)([^]]+)#iU';
([^]]+) soll dafür sorgen, dass eben nicht die URL im IMG-Code umgewandelt wird ... funktionieren tut es leider nicht :(
Hi joerg,
Naja gut, komischerweise funktioniert nun auch die U-Modifier (legt er da Wert auf Großschreibung ..?)
Wenn du zusätzlich um U-Modifier nicht auch noch den i-Modifier anhängst, wird zwischen Groß- und Kleinschreibung unterschieden - hänge U und i an, um beide Effekte zu erzielen.
Nun hab ich allerdings ein hoffentlich letztes Problem:
Eine Anweisung formt URLS in der Form http://www.... direkt in html-links um.Ein weiterer code sieht folgendermaßen aus:
[img=http://...]das überschneidet sich leider, sodass erzeugt wird:
<img src='<a href='...'></a>> ...
Dann darfst du eben URLs nicht einfach blind umwandeln - was wenn jemand http://www.das-ist-nur-ein-beispiel.de schreibt?
Setze einen eigenen Link-Tag ein - z.B. [url=http://...]Text[/url] oder wie hier im Forum: < Hier die URL >.
Alternativ könntest du in den RegEx für die URLs noch ein Leerzeichen am Anfang und am Ende setzen - dann müsste vor dem http:// ein Leerzeichen und nach der Endung ein Leerzeichen stehen, dass würde dann nicht mehr auf [img=http://...] passen.
MfG, Dennis.