seth: preg_replace \n löschen

Beitrag lesen

gudn tach klaus!

ich möchte im bereich zwischen [html] .... und [/html] alle \n entfernen.

sicher nur alle \n? oder vielleicht auch alle \r?

geht das irgendwie mit $text = preg_replace ("~[html]    [/html]~Uism", "\1", $text);
??

naja, so aehnlich.

im falle von wirklich bloss der ersetzung von \n, sollte folgendes funzen.

  
$text = preg_replace("/(\[html\])(.*?)(\[\/html\])/ise", '"\1".str_replace("\n","","\2")."\3"', $text);

([html]) matcht [html]
([/html]) matcht [/html]

(.*) wuerde gierig (greedy) alles matchen bis zum letzten vorkommnis von [/html], falls aber mehrere solcher [html]-beriche vorkommen sollten, willst du das wahrscheinlich gar nicht.
(.*?) ist die loesung dafuer, weil bloss ungreedy (also bis zum _naechsten_ [\html]) gesucht wird.
(.*?) matcht also immer die bereiche, in denen du die \n loeschen willst.

zu den modifiern:
i -> case-insensitive, d.h. [html] wird behandelt wie [HTml] usw.
     musst selbst wissen, ob du das wirklich willst.
s -> der punkt . matcht auch auf zeilenumbrueche
e -> im ersetzen-string darf php-code enthalten sein (in diesem fall ein aufruf von str_replace)

so der rest '"\1".str_replace("\n","","\2")."\3"'
ist bloss noch eine konkatenation der gematchten strings
\1 -> [html]
\2 -> alles dazwischen
\3 -> [/html]

str_replace ersetzt hier bloss die \n durch den leeren string.

mit \r und \n koennte das dann ungefaehr so aussehen:

  
$text = preg_replace("/(\[html\])(.*?)(\[\/html\])/ise", '"\1".str_replace(array("\n","\r"),array("",""),"\2")."\3"', $text);
~~~.  
  
prost  
seth