ich hab da ein ganz komisches Problem, auf das ich mir absolut keinen Reim machen kann: Und zwar möchte ich mittels eines Regulären Ausdrucks Usereingaben für ein CMS-System umwandeln. Zur Auszeichnung des Textes soll dabei eine Art BBCode verwendet werden. Nun habe ich folgenden Regex gebaut, der alle "Eventualitäten" dieses Auszeichnungscodes abdecken soll:
/^(.*?)(\s*)\[\s*([a-z0-9]+)(.*?)\](.*?)\[\/\s*\3\s*\](\s*)(.*?)$/si
Der Regex wird mittels preg_match in einer while-Schleife aufgerufen; preg_replace würde mir nicht soviel bringen, da die Subpatterns noch weiterverarbeitet werden müssen.
Kurz zur Erklärung: Im 1. Subpattern ist alles das drin, was vor den BBCode-Tags kommt, im 7. alles was dahinter kommt. Im 2. und 6. Subpattern werden die White-Spaces gespeichert, die vor bzw. hinter den Tags kommen (die müssen in einigen Fällen ersetzt werden). Im 3. Subpattern ist dann der Tag-Name drin, im 4. eventuelle Attribute. Zu guter Letzt wird im 5. Subpattern das gespeichert, was zwischen den Tags steht. Ach so, und mittels der Back-Reference \3 wird natürlich sicher gestellt, dass der End-Tag auch mit dem Start-Tag übereinstimmt.
Innerhalb der while-Schleife werden nun die BBCode-Tags durch (x)html ersetzt.
Jetzt zum Problem: Erstmal läuft das alles sehr schön; aber aufeinmal, wenn ich bspw. am Ende der Eingabe im Textfeld ein Enter mehr mache, oder auch irgendwo im Text ein Wort verändere, dann ersetzt er mir plötzlich nur noch die ersten paar Zeilen, und gibt den restlichen Code unverändert zurück. Das Verrückte dabei ist ja, dass dieses Problem nicht immer reproduzierbar ist - und auch die Stelle, wo er aufhört, den Code zu ersetzen, ist immer mal eine andere!!
Ist mir vollkommen schleierhaft. Wo liegt das Problem? Vielleicht ist ja auch im Regex was falsch, aber ich bin schon x-mal drüber gegangen, und konnte bis jetzt nichts finden, was das Problem verursachen könnte. Hätte von euch jemand eine Idee?
Gruß, dblay
Dieser Beitrag wurde von dblay bearbeitet: 21. August 2007 - 16:48