Christian Kruse: \n und \r aus String entfernen außer zwischen bestimmten Tags

Beitrag lesen

Hallo,

Ich möchte in einem String alle Zeilenumbrüche (\n) durch
ein Leerzeichen ersetzten und alle Wagenrückläufe (\r)
entfernen, außer zwischen den HTML-Tags <pre> und </pre>
bzw. <textarea> und </textarea>.

Tja, dafuer sind RegExe IMHO ungeeignet. Dafuer brauchst du einen
Parser.

Ich bin meinem Ziel inzwischen etwas näher gekommen:

$content = preg_replace("/((<pre>[^(</pre>)]*)|\n)/e", '"\2"=="\1" ? "\1" : " "', $content);
$content = preg_replace("/((<pre>[^(</pre>)]*)|\r)/e", '"\2"=="\1" ? "\1" : ""', $content);

Das matcht auch auf <pre>sdasdsadasd<, usw

Und ich habe noch ein bisschen weiter experimentiert. Bei
folgenden (erdachten) Tag-Kombinationen funktioniert es z. B.:
<pr></pr>
<tex></tex>
<text></text>

Dagegen funktioniert es nicht mit:
<asdf></asdf>
<texta></texta>
<textar></textar>
<textare></textare>

Mir ist diese Verhalten vollkommen  unerklärlich...

Mir nicht. In [] gibst du *Zeichenklassen* an. Das heisst, nur ein
einziges beliebiges Zeichen innerhalb von [] muss vorkommen, damit
diese Stelle gematcht wird. Beispiel: [abcd] matcht auf 'a', 'b',
'c', 'd' aber auch auf 'abcd' oder 'baxcsdf'.

Hat noch irgendjemand eine Idee?

Schreibe einen sinnvollen Parser oder schreibe die Inputs vom CMS um.

Gruesse,
 CK