Regex: [ und ] entfernen
e7
- php
Hi,
natürlich geht's nicht um das einfache Entfernen von [ und ]... Es geht um Text, der mit BB-Codes formatiert sein kann:
Hallo [b]Welt[/b]
Jetzt möchte ich alle BB-Codes herausnehmen, inklusive aller Buchstaben zwischendrin. Hier meine beiden Ansätze:
$content = ereg_replace('/([.*])', '', $content);
$content = preg_replace('/([*])/U', '', $content);
$content = ereg_replace('([.*])', '', $content);
Während der erste überhaupt nicht funktioniert, entfernt der zweite jeweils nur die schließende ].
Der dritte hingegen funktioniert an sich - nur entfernt der mir ein bisschen zu viel, also eigentlich alles :(
Wäre euch für einen kleinen Hinweis dankbar ;)
e7
Hallo e7.
$content = ereg_replace('/([.*])', '', $content);
$content = preg_replace('/([*])/U', '', $content);
$content = ereg_replace('([.*])', '', $content);Während der erste überhaupt nicht funktioniert, entfernt der zweite jeweils nur die schließende ].
Du musst zusätzlich noch ausschließen, dass die schließende Klammer innerhalb der BB-Tags vorkommt.
Schau dir einmal meinen Versuch an.
Die PCRE-basierten preg*-Funktionen solltest du im Übrigen den POSIX-basierten ereg*-Funktionen vorziehen.
Einen schönen Donnerstag noch.
Gruß, Ashura
Hi,
erst mal vielen Dank für deine Antwort...
Du musst zusätzlich noch ausschließen, dass die schließende Klammer innerhalb der BB-Tags vorkommt.
[url=[irgendwas]] ???
Schau dir einmal meinen Versuch an.
Das löscht mir online den gesamten Text zwischen den Tags, ich will aber nur die Tags ausfiltern... Offline bin ich noch am Testen wie ich das einbaue, an manchen Stellen klappt's, an anderen hingegen nicht... Wird wohl wieder irgendein Flüchtigkeitsbug sein ;)
Die PCRE-basierten preg*-Funktionen solltest du im Übrigen den POSIX-basierten ereg*-Funktionen vorziehen.
das hat mir die PHP-Doku auch empfohlen, ich hab's halt mal mit allen zweien ausprobiert, man weiß ja nie ob's im einen vielleicht nicht doch klappt, was im anderen nicht funktioniert :)
e7
Hi,
an anderen hingegen nicht... Wird wohl wieder irgendein Flüchtigkeitsbug sein ;)
falsch, dein Regex beschränkt sich auf "einzeichige" Tags wie [b], aber ignoriert [url=lll] oder [h1]...
e7
Hallo e7.
falsch, dein Regex beschränkt sich auf "einzeichige" Tags wie [b], aber ignoriert [url=lll] oder [h1]...
Ja, mein Fehler: ich hatte das „*“ an die falsche Stelle gesetzt.
Es muss aus der Zeichenklasse heraus hinter diese gesetzt werden.
Einen schönen Donnerstag noch.
Gruß, Ashura
Hallo e7.
[url=[irgendwas]] ???
Ein zusammen hängender Satz hätte mir nun mehr gesagt.
Schau dir einmal meinen Versuch an.
Das löscht mir online den gesamten Text zwischen den Tags, ich will aber nur die Tags ausfiltern...
Die Regex macht genau das, was du wolltest:
Jetzt möchte ich alle BB-Codes herausnehmen, inklusive aller Buchstaben zwischendrin.
Also *was genau* soll nun entfernt werden? Nur die Tags oder nur der enthaltene Text oder beides?
Einen schönen Donnerstag noch.
Gruß, Ashura
Hi,
Die Regex macht genau das, was du wolltest:
Jetzt möchte ich alle BB-Codes herausnehmen, inklusive aller Buchstaben zwischendrin.
Also *was genau* soll nun entfernt werden? Nur die Tags oder nur der enthaltene Text oder beides?
oh, jetzt wo du's sagst... Das war ein bisschen, naja, ungünstig ausgedrückt *schäm*... Eigentlich so wie im Titel geschrieben nur die Tags, also alles zwischen [ und ].
[url=[irgendwas]] ???
Ein zusammen hängender Satz hätte mir nun mehr gesagt.
dieser Fall hat sich mit der Aufklärung des Missverständnisses erledigt ;)
e7
Hi,
und noch ein Posting :) Der Regex von Andreas funktioniert, hab ihn gerade entdeckt... Dir aber trotzdem Dank für deine Hilfe, wenn ich mich gleich richtig ausgedrückt hätte *grml*
E7
Hallo e7.
Eigentlich so wie im Titel geschrieben nur die Tags, also alles zwischen [ und ].
Einen schönen Donnerstag noch.
Gruß, Ashura
Hi,
Eigentlich so wie im Titel geschrieben nur die Tags, also alles zwischen [ und ].
Also so?
mmhh... ich sollte dringend mal daran arbeiten, meine sprachliche Ausdrucksfähigkeit zu verbessern... "Zwischen" ist zwar genau das, was du geschrieben hast, aber nicht das was ich suche (bzw. gesucht habe)... <Ausrede>Bei 'Eine Zahl zwischen 1 und 9' schließt ja auch die 1 und die 9 mit ein *g*</Ausrede>
$content = preg_replace('/[[^]]+]/', '', $content);
E7
Hallo e7.
mmhh... ich sollte dringend mal daran arbeiten, meine sprachliche Ausdrucksfähigkeit zu verbessern... "Zwischen" ist zwar genau das, was du geschrieben hast, aber nicht das was ich suche (bzw. gesucht habe)...
Vielleicht beim nächsten Mal.
<Ausrede>Bei 'Eine Zahl zwischen 1 und 9' schließt ja auch die 1 und die 9 mit ein *g*</Ausrede>
Nein, bei mir nicht. Ich sage, wenn ich dies bezwecken möchte: „Eine Zahl von einschließlich 1 bis einschließlich 9.“.
Es macht eben schon einen Unterschied ob ≥ oder > bzw. ≤ oder <.
$content = preg_replace('/[[^]]+]/', '', $content);
Gut, hier wird der Inhalt nicht gesondert behandelt, aber danach hattest du sowieso eigentlich nicht gefragt.
Einen schönen Donnerstag noch.
Gruß, Ashura
Hi,
<Ausrede>Bei 'Eine Zahl zwischen 1 und 9' schließt ja auch die 1 und die 9 mit ein *g*</Ausrede>
Nein, bei mir nicht. Ich sage, wenn ich dies bezwecken möchte: „Eine Zahl von einschließlich 1 bis einschließlich 9.“.
Es macht eben schon einen Unterschied ob ≥ oder > bzw. ≤ oder <.
klar, es macht einen Unterschied - aber der wird im RL noch weniger betrachtet als der Unterschied zwischen Java/JavaScript, Standard/Standart usw. Wäre mir auch lieber, wenn alle "Eine Zahl von 1 bis 9" sagen würden :)
E7
Hallo,
ich sehe schon, ich bin heute wieder viiiiel zu langsam.....
;)
Ciao,
Andreas
Hallo,
$content = ereg_replace('/([.*])', '', $content);
$content = preg_replace('/([*])/U', '', $content);
$content = ereg_replace('([.*])', '', $content);Während der erste überhaupt nicht funktioniert, entfernt der zweite jeweils nur die schließende ].
Ja, der erste Ausdruck hat keine gültige Syntax, denn der schließende Delimiter (/) fehlt. Ansonsten wäre das der richtige _Ansatz_.
Der zweite ist für Deine Zwecke unbrauchbar: er sucht nach einem ']', vor dem beliebig viele '[' stehen, findet also z.B. [], [[], [[[] oder eben ]. Letzteres ist bei Dir der Fall.
Der dritte hingegen funktioniert an sich - nur entfernt der mir ein bisschen zu viel, also eigentlich alles :(
Na klar: Dein dritter regulärer Ausdruck sucht nach einem '[', gefolgt von n _beliebigen_ Zeichen, gefolgt von einem ']', also z.B. '[' plus 'tag]Hier der Text[\tag' plus ']'.
Probiere es mal so:
$content = preg_replace('/[[^]]+]/', '', $content);
Sieht durch die vielen [ und ] etwas verwirrend aus, ist aber ganz einfach: suche ein '[', gefolgt von 1 bis n Zeichen, die _nicht_ ']' sein dürfen, gefolgt von einem ']'.
Der Ausdruck [^]] definiert eine sogenannte Zeichenklasse. Innerhalb einer solchen Zeichenklasse kannst Du entweder alle zulässigen Zeichen auflisten oder - durch Negierung mit '^' - alle Zeichen, die nicht zulässig sind.
Alles klar?
;)
Ciao,
Andreas
Hi,
Probiere es mal so:
$content = preg_replace('/[[^]]+]/', '', $content);
Sieht durch die vielen [ und ] etwas verwirrend aus, ist aber ganz einfach: suche ein '[', gefolgt von 1 bis n Zeichen, die _nicht_ ']' sein dürfen, gefolgt von einem ']'.
klingt logisch - wie fast alles, wenn man die Lösung vor sich sieht :) Vielen Dank, der Ausdruck funktioniert und macht genau das, was er sollte!
E7
Hi e7,
natürlich geht's nicht um das einfache Entfernen von [ und ]... Es geht um Text, der mit BB-Codes formatiert sein kann:
Hallo [b]Welt[/b]
Jetzt möchte ich alle BB-Codes herausnehmen, inklusive aller Buchstaben zwischendrin.
Was willst du entfernen? Die BBCode-Formatierungsanweisungen oder Texte zwischen BBCode-"Tags"?
$content = ereg_replace('/([.*])', '', $content);
$content = preg_replace('/([*])/U', '', $content);
$content = ereg_replace('([.*])', '', $content);Während der erste überhaupt nicht funktioniert, entfernt der zweite jeweils nur die schließende ].
Beim zweiten fehlt der Punkt -- und "leere" BBCode-Tags sind mir auch nicht bekannt:
$content = preg_replace('/\[.+\]/U', '', $content);
So entfernst du alle BBCode-Tags. War es das, was du erreichen wolltest?
MffG
EisFuX
Hi,
Beim zweiten fehlt der Punkt --
stimmt :(
und "leere" BBCode-Tags sind mir auch nicht bekannt:
Das Risiko gehe ich gerne ein, dass auch [] ausgefiltert wird.
$content = preg_replace('/[.+]/U', '', $content);
hey cool, es geht ja noch kürzer :) Aber halt, da ist ein + drin, d. h. [] wird nicht ausgefiltert... Das ist aber, wenn ich so darüber nachdenke, gar nicht mal so schlecht wenn das dann auch noch weg ist :)
E7