klaus: preg_replace \n löschen

hi!

ich möchte im bereich zwischen [html] .... und [/html] alle \n entfernen.
geht das irgendwie mit $text = preg_replace ("~[html]    [/html]~Uism", "\1", $text);

??

ich hoffe mir kann jemand helfen :)
danke..

  1. 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
    
    1. Hallo seth,

      $text = preg_replace("/([html])(.*?)([/html])/ise",

      Wenn du z.B. ~ als Begrenzer nimmst, musst du den / in [/html] nicht maskieren.

      '"\1".str_replace("\n","","\2")."\3"', $text);[/code]

      Das Handbuch empfiehlt nicht \1 sondern $1 zu verwenden.

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

      der zweite Parameter von preg_replace darf auch ein String sein wenn der erste ein Array ist.

      Grüße aus Nürnberg
      Tobias

      --
      TOP7: Hinweise, dass eine neue Eiszeit naht
      Selfcode: ie:% fl:( br:< va:) ls:[ fo:) rl:° n4:& ss:) de:] js:| ch:? sh:( mo:| zu:)
      1. gudn tach!

        $text = preg_replace("/([html])(.*?)([/html])/ise",
        Wenn du z.B. ~ als Begrenzer nimmst, musst du den / in [/html] nicht maskieren.

        richtig (ich nehm trotzdem fast immer das '/', um nicht umdenken zu muessen).

        '"\1".str_replace("\n","","\2")."\3"', $text);[/code]
        Das Handbuch empfiehlt nicht \1 sondern $1 zu verwenden.

        normalerweise mache ich mehr mit perl und von dort kenne ich die $-bevorzugung, welche auch tatsaechlich im handbuch steht. deshalb habe ich extra mal vor einiger zeit auf http://de.php.net/manual/en/reference.pcre.pattern.syntax.php geschaut, ob da was zu steht, aber dort ist nur von \1 die rede. deswegen verwendete ich das backslash.
        wo steht das mit $1?

        $text = preg_replace("/([html])(.*?)([/html])/ise", '"\1".str_replace(array("\n","\r"),array("",""),"\2")."\3"', $text);[/code].
        der zweite Parameter von preg_replace darf auch ein String sein wenn der erste ein Array ist.

        oh, gut. vermutet habe ich es, war aber zu faul nachzuschlagen.

        aber wenn wir nun schon an feinheiten sind... fuer's archiv:
        mit zero-width positive look-ahead und look-behind-assertions, die ich hier nicht erklaeren moechte, sondern bloss auf perldoc perlre bzw. auf php.net/... hinweise, saehe das dann z.b. so aus:
        $text = preg_replace("/(?<=\[html\])(.+?)(?=\[\/html\])/ise", 'str_replace(array("\n","\r"),"","\1")', $text);

        oh, gut, dass ich das vorher mal schnell ausprobiert habe, denn es wirft fuer mich eine frage auf:

          
        #!/usr/bin/perl -w  
        use strict;  
        my $text='abc';  
        print $text."\n";  
        $text=~s/(?<=a).*(?=c)/x/;  
        print $text."\n";
        

        gibt aus:
           abc
           axc

          
        <?php  
        $text='abc';  
        echo $text."\n";  
        $text = preg_replace('/(?<=a).*(?=c)/', 'x', $text);  
        echo $text."\n";  
        ?>
        

        gibt aus:
           abc
           abc

        es wird also in php nix gematcht.

        warum?

        wenn man .* durch .+ ersetzt, funzts uebrigens in beiden (wie in perl).

        prost
        seth

        1. Hallo seth,

          wo steht das mit $1?

          Auf der Seite zu preg_replace().

          Grüße aus Nürnberg
          Tobias

          1. gudn tach Tobias!

            wo steht das mit $1?
            Auf der Seite zu preg_replace().

            ah, gut.
            also beschliesse ich nun, dass http://de2.php.net/manual/en/reference.pcre.pattern.syntax.php doof (im sinne von unvollstaendig/veraltet) ist.

            prost
            seth