marcus: regular expressions oder andere lösung

hallo zusammen,

ich habe folgendes problem, an dem ich mir bei der hitze die letzten nerven aufreibe:

ein string mit beliebigem inhalt und mittendrin immer wieder ein bestimmtes token: z.b. "[xxx] ... [xxx] ... [xxx]".

jetzt muss ich jedes vorkommende token umbenennen, damit ich am ende folgendes habe:

...[xxx1] ... [xxx2] ... [xxx3] ... [xxx4]... etc.

die token an sich zu erkennen ist ja mittels regular expression noch relativ einfach, aber wie ersetze ich sie, damit ich eindeutige tokens im string habe??

bin für jede idee dankbar!

danke, gruß und schönes wochenende

marcus

  1.   
    <?php  
    $string = "1234567890";  
    $tokenabstand = 3;  
    $len = strlen($string);  
    $array = array();  
    for($i=0;$i<=$len;$i=$i+$tokenabstand) {  
    $teil = substr($i,$tokenabstand,$string);  
    array_push($array,$teil); }  
    ?>  
    
    

    Ich habe das Script nicht getestet, aber so ansatzweise müsste es stimmen...

    1. Sorry... ich hab die Ausgabe vergessen^^

        
      <?php  
      $tokens = array("token1","token2");  
      for($l=1;$l<=$len;$l++) {  
      echo "$array[$l] $tokens[$l]"; }  
      ?>
      
    2. Ich habe das Script nicht getestet, aber so ansatzweise müsste es stimmen...

      hi felix,

      jetzt hab ich eine lösung, die passt aber nicht ganz zu meinem problem ;-)

      dein script zerstückelt einen string nach X zeichen auseinander und schreibt die teilstücke in ein array... was du übrigens mit wordwrap gefolgt von explode in 2 zeilen hättext realisieren können... aber egal :-)

      was ich brauche ist das umbenennen (fortlaufend nummerieren) von identischen tokens innerhalb eines strings...

      hat noch jemand eine idee?

      danke und gruß
      marcus

      1. hi,

        was ich brauche ist das umbenennen (fortlaufend nummerieren) von identischen tokens innerhalb eines strings...

        hat noch jemand eine idee?

        preg_replace_callback

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. Hallo marcus,

    ein string mit beliebigem inhalt und mittendrin immer wieder ein bestimmtes token: z.b. "[xxx] ... [xxx] ... [xxx]".

    jetzt muss ich jedes vorkommende token umbenennen, damit ich am ende folgendes habe:

    ...[xxx1] ... [xxx2] ... [xxx3] ... [xxx4]... etc.

    die token an sich zu erkennen ist ja mittels regular expression noch relativ einfach, aber wie ersetze ich sie, damit ich eindeutige tokens im string habe??

    Du hast (wie immer) mehrere Möglichkeiten. Hier mal zwei Ansätze:

    Ansatz 1: Du benutzt den Limit-Parameter von preg_replace(). Leg ihn auf 1 fest und benutze preg_replace() in einer Schleife mit Zähler. So kannst du der Reihe nach die "Tokens" durch einen nummerierten String ersetzen.

    Ansatz 2: Du benutzt preg_match_all() Übergib der Funktion das zusätzliche Flag PREG_OFFSET_CAPTURE, und sie liefert dir zum Array der gefundenen Tokens noch die Positionen im zu durchsuchenden String mit. Mit dieser Information kannst du dir den Ergebnisstring ebenfalls in einer Schleife wieder neu basteln -- und dabei statt der gefundenen Tokens eben die mit dem Zähler wieder einbauen.

    MffG
    EisFuX

    --
    Auch meine Hosenträger sind intelligent, in dem Sinne, dass man sie regulieren kann. Sie besitzen ein adaptives Verhalten.
    Stanisław Lem
    1. gudn tach!

      Ansatz 1: Du benutzt den Limit-Parameter von preg_replace(). Leg ihn auf 1 fest und benutze preg_replace() in einer Schleife mit Zähler. So kannst du der Reihe nach die "Tokens" durch einen nummerierten String ersetzen.

      in diesem zusammenhang koennte \G interessant sein, damit nicht immer der komplette string durchsucht werden muss.
      \G sagt normalerweise z.b. in einer schleife, dass ab dort weitergesucht werden soll, wo eben (also beim letzten durchlauf) aufgehoert wurde.
      ob/wie php damit zurechtkommt muesstest du mal ausprobieren. das manual macht widerspruechliche angabe zur existenz dieser funktionalitaet.

      Ansatz 2: Du benutzt preg_match_all() Übergib der Funktion das zusätzliche Flag PREG_OFFSET_CAPTURE, und sie liefert dir zum Array der gefundenen Tokens noch die Positionen im zu durchsuchenden String mit. Mit dieser Information kannst du dir den Ergebnisstring ebenfalls in einer Schleife wieder neu basteln -- und dabei statt der gefundenen Tokens eben die mit dem Zähler wieder einbauen.

      auf aehnliche weise koennte man auch via preg_split (je nach bedarf mit PREG_SPLIT_DELIM_CAPTURE), oder falls der "[xxx]"-kram auch ohne regexp findbar ist mit explode, vorgehen.

      in anlehnung an wahsagas vorschlag mit preg_replace_callback waere auch ein einfacher aufruf von preg_replace mit dem e-modifier denkbar. letzteres ist vermutlich die kuerzeste (bezogen auf die quellcode-laenge) loesung:

        
      $s='asd[xxx]bbdddb[xxx]asfhgsf[xxx]jhgfjsh[xxx]';  
      $i=0;  
      $s=preg_replace('/(\[xxx)(])/e',"'$1'.++\$i.'$2'", $s);
      

      welches von diesen vielen moeglichkeiten nun die schnellste (in der ausfuehrung) ist, vermag ich jedoch nicht zu sagen.

      prost
      seth