bleicher: preg_replace

Grüße,
es tut mir eid wenn ich mit den regexp fragen nerve^^ aber ich stellte mir einfach die frage - ich weiss wie man aus einem string ein teil extrahiert ud neu zusammenbaut. aber wie ersetzt man alle "suchstrings" im gegebenen bereich?

sagen wir - wie entfernt man alle <br> zwischen <pre></pre>?

soweit habe ich es gedacht,, aber weiter?

  
preg_replace("/\<pre\>(\<bre\>+?)\<\/pre\>", " ", $string); 

MFG
bleicher

  1. aber wie ersetzt man alle "suchstrings" im gegebenen bereich?
    sagen wir - wie entfernt man alle <br> zwischen <pre></pre>?
    soweit habe ich es gedacht,, aber weiter?

    preg_replace("/<pre>(<bre>+?)</pre>", " ", $string);

      
      
    Ich verwende positive Lookahead und Lookbehind Assertions.  
    Was zwischen <pre> ist, wird an eine Sub weiter gereicht, aber nur wenn notwendig.  
      
    In PHP kanst du etwas ähnliches mit: preg\_replace\_callback() machen  
    Handbuch:  
    mixed preg\_replace\_callback ( mixed $Suchmuster, callback $Callback, mixed $Zeichenkette [, int $Limit [, int &$Anzahl]] )  
    Limit ist per Standard -1 also unbegrenzt, wird alles matchen  
      
    Meine Perl Implementation:  
      
    ~~~perl
      
    #!C:/Programme/Perl/bin/perl.exe -w  
    #  
    use strict;  
      
    BEGIN {  
     use CGI::Carp qw(carpout);  
     open(LOG, ">>error.txt")  or  die "Unable to append to error.txt: $!\n";  
     carpout(*LOG);  
    }  
      
    my $string = "abc <pre> xxx <br> yyy <br>zzz </pre> abc <pre>123</pre> abc";  
      
    $string =~ s#(?<=<pre>)(.*?<br>.*?)(?=</pre>)#convert_br_to_nl($1)#eg;  
      
    sub convert_br_to_nl{  
      my $t = shift;  
      $t =~ s/<br>/\n/g;  
      return $t;  
    }  
      
    print $string, "\n";  
      
    sleep(10);  
      
    exit;  
    __END__  
    
    

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o
    1. Grüße,
      danke :)

      preg_replace_callback kannte ich noch nicht ^^! ist echt nette funktion.

      was jetzt allerdings seltsam ist -

        
      $string=preg_replace_callback("/\[code\](.+?)\[\/code\]/s", "codedecode", $string);  
      
      

      die function kriegt nicht nur das zwischen `` sonder das erste - [code] im string auch noch dazu übergeben.
      ich dachte bisher die () definieren die übergabeparameter. wieso wird jetzt das [code] mitgenommen O_o?

      MFG
      bleicher

      1. preg_replace_callback kannte ich noch nicht ^^! ist echt nette funktion.

        was jetzt allerdings seltsam ist -

        $string=preg_replace_callback("/[code](.+?)[/code]/s", "codedecode", $string);

        
        >   
        > die function kriegt nicht nur das zwischen `` sonder das erste - [code] im string auch noch dazu übergeben.  
        > ich dachte bisher die () definieren die übergabeparameter. wieso wird jetzt das [code] mitgenommen O\_o?  
          
        Weil du keine Lookbehind (the matched String) und Lookahead (the matched string) verwendest, sondern nur "the matched string" welcher zu ersetzen ist.  
        Wiederum wendest du preg\_replace\_callback() falsch=sinnlos im Kontext an  
          
        Das zweite Argument sollte eine Funktion sein, der du $1 als Parameter übergibst.  
        Lies nochmals in deinem Handbuch nach.  
          
        mfg Beat
        
        -- 
        Woran ich arbeite:  
        [X-Torah](http://www.elcappuccino.ch/cgi/tok.pl?extern=1-pub-com3306-1)  
           <°)))o><                      ><o(((°>o  
        
        
        1. Wiederum wendest du preg_replace_callback() falsch=sinnlos im Kontext an

          Das war voreilig von mir.

          sofern du natürlich deine Funktion mit Übergabe deklarierst, ist das schon richtig.

          mfg Beat

          --
          Woran ich arbeite:
          X-Torah
             <°)))o><                      ><o(((°>o
        2. Grüße,

          Weil du keine Lookbehind (the matched String) und Lookahead (the matched string) verwendest, sondern nur "the matched string" welcher zu ersetzen ist.

          oops^^ das ist mit neu :P

          in der docu steht dass man das erfassen mit (?:.+) verhindern könnte, was aber nicht functioniert.

          preg_replace_callback("/\[code\](?:.+?)\[\/code\]/s",...

          zudem war ja mein ziel weder vor noch nachfolgenden string mitzunehmen, sondern das "dazwischen", ist es möglich?

          Wiederum wendest du preg_replace_callback() falsch=sinnlos im Kontext an

          warum? cann man den string zwischen zwei delimitern [c0de][/c0de] (mit "o" aber sonst reagiert forumscript ;) einfahcer durch htmleintites und ein paar weitere functionen jagen?

          Das zweite Argument sollte eine Funktion sein,

          function codedecode() {} befidnet isch etwas weiter oben im quelltext.

          MFG
          bleicher

          1. Weil du keine Lookbehind (the matched String) und Lookahead (the matched string) verwendest, sondern nur "the matched string" welcher zu ersetzen ist.

            oops^^ das ist mit neu :P

            in der docu steht dass man das erfassen mit (?:.+) verhindern könnte, was aber nicht functioniert.

            (?: ) ist ein nicht speichernde ($1 ..$99) Gruppe, was du suchst ist im Handbuch beschrieben unter Assertions:

            Assertions
            An assertion is a test on the characters following or preceding the current matching point that does not actually consume any characters. The simple assertions coded as \b, \B, \A, \Z, \z, ^ and $ are described above. More complicated assertions are coded as subpatterns. There are two kinds: those that look ahead of the current position in the subject string, and those that look behind it.

            An assertion subpattern is matched in the normal way, except that it does not cause the current matching position to be changed. Lookahead assertions start with (?= for positive assertions and (?! for negative assertions. For example, \w+(?=;) matches a word followed by a semicolon, but does not include the semicolon in the match, and foo(?!bar) matches any occurrence of "foo" that is not followed by "bar". Note that the apparently similar pattern (?!foo)bar does not find an occurrence of "bar" that is preceded by something other than "foo"; it finds any occurrence of "bar" whatsoever, because the assertion (?!foo) is always TRUE when the next three characters are "bar". A lookbehind assertion is needed to achieve this effect.

            ...

            Deine Lektüre.

            mfg Beat

            --
            Woran ich arbeite:
            X-Torah
               <°)))o><                      ><o(((°>o
            1. Grüße,
              jep - ([?<=[c0de])(.+) nimmt code nciht mit. allerdings - es bleibt im string enthalten. [/c0de] "verschwiodnet" aber. kann man den [c0de] genauso "verschwinden" lassen? also erfassen aber nicht weitergeben?
              ich kann den [c0de] zwar noch str_replace raubügeln, baer es geht ums prinzip! hab nähmlich schon viel dazu gelernt ,)
              MFG
              bleicher