Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Problem mit String ersetzen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Problem mit String ersetzen

    Hallo, ich bin neu in diesem Forum und habe gleich schon eine Frage. Ich möchte in einem String wie z.B. "aaxyaxyzaaxyzxaa" nach dem String aa suchen und durch einen festen String (ab) ersetzen.
    Dies wäre auch relativ einfach, wenn ich nicht maximal einmal aa ersetzt haben wollte.
    Als Ausgabestring hätte ich gerne ein array("abxyaxyzaaxyzxaa", "aaxyaxyzabxyzxaa", "aaxyaxyzaaxyzxab")

    Leider habe ich entweder nur Funktionen gefunden, welche alle aa durch ab ersetzen oder nur das erste(preg_replace mit Limit Angabe von 1).

    Ich hoffe es kann mir einer weiterhelfen.

    MFG


  • #2
    PHP-Code:
    <?php
        
    function getSingleReplaceCombinations($replace$with$inHaystack)
        {
            
    $splits  explode($replace$inHaystack);
            
    $result  = array();
            for (
    $i 1$ix count($splits); $i $ix; ++$i) {
                
    $previous array_slice($splits0$i);
                
    $next     array_slice($splits$i);
                
                
    $combine  array_pop($previous) . $with array_shift($next);
                
    $result[] = implode($replacearray_merge($previous, array($combine), $next));
            }
            return 
    $result;
        }
        
        
    var_dump(getSingleReplaceCombinations("1""_""101111xx"));
    ?>
    Code:
    array(5) {
      [0]=>
      string(8) "_01111xx"
      [1]=>
      string(8) "10_111xx"
      [2]=>
      string(8) "101_11xx"
      [3]=>
      string(8) "1011_1xx"
      [4]=>
      string(8) "10111_xx"
    }
    Geht bestimmt auch einfacher.
    "Mein Name ist Lohse, ich kaufe hier ein."

    Kommentar


    • #3
      Zitat von Freddy Beitrag anzeigen
      ...
      Ich möchte in einem String wie z.B. "aaxyaxyzaaxyzxaa" nach dem String aa suchen und durch einen festen String (ab) ersetzen.
      Dies wäre auch relativ einfach, wenn ich nicht maximal einmal aa ersetzt haben wollte.
      Als Ausgabestring hätte ich gerne ein array("abxyaxyzaaxyzxaa", "aaxyaxyzabxyzxaa", "aaxyaxyzaaxyzxab")
      PHP-Code:
      /// return array of strings
      function fw_replace_special(
          
      $needle,
          
      $replace_with,
          
      $haystack
      ) {
          
      $pcre '/'preg_quote($needle'/') .'/';
          
      $replaced = array ();
          
      $off 0;
          while (
      preg_match($pcre$haystack$hitsPREG_OFFSET_CAPTURE$off)) {
              
      $found_off =  $hits[0][1];
              
      $found_length strlen($hits[0][0]);
              
      $replaced[] = substr_replace(
                  
      $haystack
                  
      $replace_with
                  
      $found_off
                  
      $found_length
              
      );
              
      $off $found_off $found_length;
          }
          return 
      $replaced;
      }

      // test
      $haystack 'aaxyaxyzaaxyzxaa';
      $needle 'aa';
      $replace_with '**';

      $replaced fw_replace_special($needle$replace_with$haystack);
      var_dump($replaced); 

      *edit*
      Mist, zu spät ...
      Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

      Kommentar


      • #4
        lol fire Aber finds immer wieder schön zu sehen wie verschiedene Lösungen zum selben Ergebnis führen können.

        PS: Ich hatte auch überlegt mit einer while(mb_strpos(, $pos))) Schleife zu arbeiten, vermutlich sogar das schnellste.

        Edit: Ha, hab ichs doch noch geschafft mit meinem mb_strpos()-Skript:
        PHP-Code:
        // Chriz I
        function getSingleReplaceCombinations1($replace$with$inHaystack)
        {
            
        $splits  explode($replace$inHaystack);
            
        $result  = array();
            for (
        $i 1$ix count($splits); $i $ix; ++$i) {
                
        $previous array_slice($splits0$i);
                
        $next     array_slice($splits$i);
                
                
        $combine  array_pop($previous) . $with array_shift($next);
                
        $result[] = implode($replacearray_merge($previous, array($combine), $next));
            }
            return 
        $result;
        }

        // fireweasel
        function getSingleReplaceCombinations2($needle$replace_with$haystack) {
            
        $pcre '/'preg_quote($needle'/') .'/';
            
        $replaced = array ();
            
        $off 0;
            while (
        preg_match($pcre$haystack$hitsPREG_OFFSET_CAPTURE$off)) {
                
        $found_off =  $hits[0][1];
                
        $found_length strlen($hits[0][0]);
                
        $replaced[] = substr_replace($haystack$replace_with$found_off$found_length);
                
        $off $found_off $found_length;
            }
            return 
        $replaced;
        }

        // Chriz II
        function getSingleReplaceCombinations3($replace$with$inHaystack)
        {
            
        $offset 0;
            
        $length mb_strlen($replace);
            
        $result = array();
            while ((
        $found mb_strpos($inHaystack$replace$offset)) !== false) {
                
        $result[] = mb_substr($inHaystack0$found) . $with mb_substr($inHaystack$found $length);
                
        $offset   $found $length;
            }
            return 
        $result;
        }


        $expectedResult = array("_baaaaab""ab_aaaab""aba_aaab""abaa_aab""abaaa_ab""abaaaa_b");

        Debug::microtime("Chriz I (Start)");
        for (
        $i 0$i 100000; ++$i) {
            
        assert(getSingleReplaceCombinations1("a""_""abaaaaab") === $expectedResult);
        }
        Debug::microtime("Chriz I (Ende)");

        Debug::microtime("fireweasel (Start)");
        for (
        $i 0$i 100000; ++$i) {
            
        assert(getSingleReplaceCombinations2("a""_""abaaaaab") === $expectedResult);
        }
        Debug::microtime("fireweasel (Ende)");

        Debug::microtime("Chriz II");
        for (
        $i 0$i 100000; ++$i) {
            
        assert(getSingleReplaceCombinations3("a""_""abaaaaab") === $expectedResult);
        }
        Debug::microtime("Chriz II (Ende)");
        Debug::stop(); 
        Code:
        DEBUG BACKTRACE
        
        [ 1] E:\Projekte\antiphp.local\public\index.php:74
             Debug::stop()
        
        DEBUG MEMORY 597,000 of 786,432
        
        DEBUG RUNTIME
        
        +   0.000000s
                       Chriz I (Start)    > E:\Projekte\antiphp.local\public\index.php:57
        +   4.604352s
                       Chriz I (Ende)     > E:\Projekte\antiphp.local\public\index.php:61
        +   0.000022s
                       fireweasel (Start) > E:\Projekte\antiphp.local\public\index.php:63
        +   3.237261s
                       fireweasel (Ende)  > E:\Projekte\antiphp.local\public\index.php:67
        +   0.000020s
                       Chriz II           > E:\Projekte\antiphp.local\public\index.php:69
        +   2.783521s
                       Chriz II (Ende)    > E:\Projekte\antiphp.local\public\index.php:73
        +   0.000102s
                       DEBUG STOP         > E:\Projekte\antiphp.local\library\classes\Debug.php:178
        =  10.625278s
        
        DEBUG STOP
        Mein erstes Skript für 100.000 kleine Ersetzungen + Zusicherung mit 4,6 Sekunden, dein Skript 3,23 und mein zweiter Anlauf 2,78 Sekunden
        "Mein Name ist Lohse, ich kaufe hier ein."

        Kommentar


        • #5
          Ich war in der Zwischenzeit mit was anderem beschäftigt, und hatte vergessen, den Reload-Button zu drücken, bevor ich meinen Post absetzte. Passiert mir öfters ...

          Jetzt solltest du (der Fairness halber) aber noch eine Variante mit strpos() bauen und meine Version auch als preg_match() mit '/u' (für UTF- testen ...
          Wenn man die Wurst schräg anschneidet, hält sie länger, weil die Scheiben größer sind.

          Kommentar


          • #6
            Vielen Dank für eure Hilfe. Habe nicht mit einer so ausführlichen Antwort gerechnet.

            MFG
            Freddy

            Kommentar

            Lädt...
            X