html_entity_decode mit preg_replace verwenden

Hallo!
Ich versuche für einen Blog so eine Art BB-Code zu entwickeln, wo es aber auch durch [html]htmlcode[/html] erfahreneren Nutzern möglich sein soll, html zu verwenden. Dafür habe ich jetzt folgende Zeilen programmiert:

$string = htmlentities($string);
/\*
sonstige
BB-Code-Ersetungen
\*/
$string = preg\_replace("#\[html\](.\*)\[/html\]#i", html\_entity\_decode("$1"), $string);
echo $string;

Mit der letzten Zeile soll nun der erste Schritt für [html]-Bereiche wieder rückgängig gemacht werden. $1 steht deshalb in " ", da sonst ein Fehlermeldung aufgrund der Variablenbenennung erscheint.
Ausgegeben wird an dieser Stelle der String, der von htmlentities kommt, allerdings ohne die html-BB-Tags.
Woran liegt das? Wie kann man dieses Problem umgehen? Ich danke Euch schon einmal für Eure Antworten! Viele Grüße JojO

$string = htmlentities($string);
/*
sonstige
BB-Code-Ersetungen
*/
$string = preg_replace("#[html](.*)[/html]#i",
html_entity_decode("$1"), $string);
echo $string;

Mit der letzten Zeile soll nun der erste Schritt für
[html]-Bereiche wieder rückgängig gemacht werden. $1 steht
deshalb in " ", da sonst ein Fehlermeldung aufgrund der
Variablenbenennung erscheint.

man soll fehlermeldungen lesen und verstehen und den fehler beheben - nicht die fehlerausgabe unterdruecken.

wo wird denn $1 deklariert?!

$1 ist keine variable sondern wiederum ein suchmuster fuer den regex-parser und das auch erst, wenn der regex ausgefuehrt wird. nach deiner notation brauchst du es aber als variable schon wenn das script geparst wird. nach deiner notation muesstest du preg_replace_callback verwenden udn den aufruf von html_entity_decode in einer callback-funktion kapseln.

aber eigentlich brauchst du das auch nciht, weil du sinngemaess schreiben kannst:

$string = htmlentities($string);
$string = preg\_replace("#\[html\](.\*)\[/html\]#i","\\$1",$string);
$string = html\_entity\_decode($string);
echo $string;

aber ich glaube es wird nicht tun, weil html_entity_decode dein html kaputt macht.

Hallo, erstmal Danke für Deine Antwort.

$string = htmlentities($string);
$string = preg\_replace("#\[html\](.\*)\[/html\]#i","\\$1",$string);
$string = html\_entity\_decode($string);
echo $string;

Wenn ich das so versuche, wird $1 ausgegeben. Ohne „\“ wird dann natürlich $string komplett wieder decodiert. Wenn ich jetzt sowas hier als Callback-Funktion verwende, klappt es auch nicht:

function callback\_html\_decode($str) {
 return html\_entity\_decode($str);
}

>aber ich glaube es wird nicht tun, weil html_entity_decode dein html kaputt macht.

Wie soll ich da ganze lösen, wenn es so nicht funktionieren soll?

Gruß Jojo

$string = htmlentities($string);
$string =
preg_replace("#[html](.*)[/html]#i","\$1",$string);
$string = html_entity_decode($string);
echo $string;

Wenn ich das so versuche, wird $1 ausgegeben. Ohne „\“ wird
dann natürlich $string komplett wieder decodiert.

stimmt, da ist ein \ vor dem $1 zuviel. es muss „$1“ oder ‚$1‘ lauten.

Wenn ich
jetzt sowas hier als Callback-Funktion verwende, klappt es
auch nicht:

function callback_html_decode($str) {
return html_entity_decode($str);
}

das ist ja auch keine gueltige callback funktion. bemuehe das manual.

aber ich glaube es wird nicht tun, weil html_entity_decode
dein html kaputt macht.

Wie soll ich da ganze lösen, wenn es so nicht funktionieren
soll?

das ist abhaengig vom kontext und von dem was du im originalpost weggelassen hast.
naja, taste dich ran.

Hallo!

Ich versuche für einen Blog so eine Art BB-Code zu entwickeln,
wo es aber auch durch [html]htmlcode[/html]
erfahreneren Nutzern möglich sein soll, html zu verwenden.
Dafür habe ich jetzt folgende Zeilen programmiert:

$string = htmlentities($string);
/*
sonstige
BB-Code-Ersetungen
*/
$string = preg_replace("#[html](.*)[/html]#i",
html_entity_decode("$1"), $string);
echo $string;

Mit der letzten Zeile soll nun der erste Schritt für
[html]-Bereiche wieder rückgängig gemacht werden. $1 steht
deshalb in " ", da sonst ein Fehlermeldung aufgrund der
Variablenbenennung erscheint.
Ausgegeben wird an dieser Stelle der String, der von
htmlentities kommt, allerdings ohne die html-BB-Tags.
Woran liegt das? Wie kann man dieses Problem umgehen? Ich
danke Euch schon einmal für Eure Antworten! Viele Grüße JojO

Ich kapiere nicht ganz, was Du erreichen willst. Kannst
Du mal ein konkretes Beispiel für konkrete Schritte geben?
Was soll das html_entity_decode() bringen?

Grüße

CMБ

Hallo.
Ich möchte - wie gesagt - so eine Art BB-Code für einen Blog erstellen. Dabei gehe ich von einem Nutzer aus, der überhaupt keine Ahnung von HTML etc hat. Also soll er auch benutzen können, ohne dass irgendetwas passiert. Erfahrenere Nutzer sollen aber die Möglichkeit haben, über [html]htmltext[/html] doch HTML verwenden zu können.
Also wende ich erst htmlentities an und möchte das dann wieder mit html_entity_decode für die [html]-Bereiche rückgängig machen, aber wie bereits beschrieben klappt das nicht so, wie ich mir das vorstelle…
Viele Grüße der Jojo

Ah super, jetzt hab ich’s geschafft und weiß auch was eine CallBack-Funktion ist:wink:

$string = preg\_replace\_callback("#\[html\](.\*)\[/html\]#i",
 create\_function('$matches', 'return html\_entity\_decode($matches[1]);'), $string);

So schaut das jetzt bei mir aus.

Danke für Deine Hilfe!

Hallo.

Ich möchte - wie gesagt - so eine Art BB-Code für einen Blog
erstellen. Dabei gehe ich von einem Nutzer aus, der überhaupt
keine Ahnung von HTML etc hat. Also soll er auch
benutzen können, ohne dass irgendetwas passiert. Erfahrenere
Nutzer sollen aber die Möglichkeit haben, über
[html]htmltext[/html] doch HTML verwenden
zu können.
Also wende ich erst htmlentities an und möchte das dann wieder
mit html_entity_decode für die [html]-Bereiche rückgängig
machen, aber wie bereits beschrieben klappt das nicht so, wie
ich mir das vorstelle…

Also im Grunde sowas:

function deBBify($matches) { return html_entity_decode($matches[1]); }


$string = preg_replace_callback(
‚/[html](.*?)[/html]/i‘,
deBBify,
htmlentities($string)
);

Oder noch anders? Dann pack doch bitte
mal einen konkreten Ausgangsstring hier rein.

Grüße

CMБ

Genau, so habe ich das im Prinzip auch gerade hinbekommen(siehe Antwort auf Posting von Jörg). Trotzdem vielen Dank für deine Antwort!

Hallo.
Inzwischen ist doch noch eine Frage aufgekommen. Ich verwende ja folgenden regulären Ausdruck:

#\[html\](.\*)\[/html\]#i

Zum einen sind aber in dem Punkt keine Zeilenumbrüche vorhanden, was zu Problemen führt, wenn man einen [html]-bereich über mehrere Zeilen schreiben möchte. Daher habe ich das ganze zu diesem Ausdruck abgewandelt:

#\[html\]([\s\S]\*)\[/html\]#i

Allerdings habe ich dann nach wie vor das Problem, dass etwa bei diesem String „[html] hallo [/html] [html] hi [/html]“ als Haystack dies hier ausgegeben wird " hallo [/html] [html] hi ", da das hintere [/html] als Endmarkierung verwendet wird.
Das heißt, ich muss den Ausdruck so umformen, dass das erste vorkommende [/html] als Ende verwendet wird. Wie kann ich so etwas machen? Ich habe schon alles mögliche versucht, aber das klappt alles nicht so recht…

Ich hoffe ihr könnt mir zumindest einen Gedankenanstoß geben, noch besser eine fertige Lösung, da es ein bisschen eilt. Vielen Dank!

Gruß Jojo

Hallo.
Inzwischen ist doch noch eine Frage aufgekommen. Ich verwende
ja folgenden regulären Ausdruck:

#[html](.*)[/html]#i

Zum einen sind aber in dem Punkt keine Zeilenumbrüche
vorhanden,

modifier s „single line“

#\[html\](.\*)\[/html\]#si

Allerdings habe ich dann nach wie vor das Problem, dass etwa
bei diesem String „[html] hallo [/html]
[html] hi [/html]“ als Haystack dies hier
ausgegeben wird " hallo [/html]
[html] hi ", da das hintere [/html] als
Endmarkierung verwendet wird.

modifier U „ungreedy“

#\[html\](.\*)\[/html\]#Usi

Ich hoffe ihr könnt mir zumindest einen Gedankenanstoß geben,

http://de2.php.net/manual/de/reference.pcre.pattern…

Super!! Danke!!