hanns: suchen und ersetzen

hallo

ich habe in einem dokument mehrere strings der form:
dddddddxxhhhh. also die ddddddd-komponente und die hhhh-komponente
sind immer identisch, nur das xx variiert, weil es eine zahl ist.

nun möchte ich NUR die xx kompentente durch xxbbb ersetzen, wobei
bbb immer etwas konstantes ist ... wie kann ich das machen???

gruss
hanns

  1. Lieber hanns,

    mit preg_replace geht das spielend leicht. Dazu müsstest Du Dich ein klein wenig mit regulären Ausdrücken auskennen.

    Beispiel:

     $string = 'alle-meine-Entchen-25-schwimmen-auf-dem-See';  
    $ersetzung = '(Stück)';  
    $ergebnis = preg_replace('~^(.*\D\d\d)(\D.*)$~', '\\1'.$ersetzung.'\\2', $string);
    

    Obiges sollte dieses ausgeben: "alle-meine-Entchen-25(Stück)-schwimmen-auf-dem-See"

    Dabei gehe ich in meinem Suchmuster davon aus, dass es sich um exakt zwei Ziffern (\d bedeutet Ziffer) handelt, denen eine Nicht-Ziffer (\D) vorausgeht, und auf die ebenso eine Nichtziffer folgt. Ein Punkt bedeutet "irgendein Zeichen", wobei standardmäßig Zeilenenden nicht gemeint sind. Das Sternchen hinter dem Punkt (also "irgendein Zeichen") bedeutet "beliebig viele davon, auch keines".
    Die Klammern bedeutet "merke Dir das". Ich kann dann mit \1 auf den gemerkten Inhalt der ersten, und mit \2 auf dem gemerkten Inhalt der zweiten Klammer zurückgreifen (siehe zweites Argument der Funktion).

    Liebe Grüße aus Ellwangen,

    Felix Riesterer.

    1. vielen dank!

      es können allerdings beliebig viele ziffern sein, also
      die zahlen von 1 bis 100.000

      ich werde mal sehen, was ich damit machen kann.
      vielen dank!!!!

      1. lieber felix riesterer,

        es hat geklappt :-) ... aber nur, weil du
        die erklärungen dazu geschrieben hast.

        danke.

        1. Lieber hanns,

          es hat geklappt :-) ... aber nur, weil du
          die erklärungen dazu geschrieben hast.

          das freut mich! Ich liebe diese regulären Ausdrücke, da sie einem das Leben um soooovieles leichter machen!

          danke.

          Gern geschehen. Sieh Dir ruhig auch mein neues Beispiel an. ;-)

          Liebe Grüße aus Ellwangen,

          Felix Riesterer.

      2. Lieber hanns,

        es können allerdings beliebig viele ziffern sein, also
        die zahlen von 1 bis 100.000

        wenn diese Ziffern ohne Punkte dazwischen stehen, dann kann man das Suchmuster entsprechend einfach modifizieren:

         $string = 'alle-meine-Entchen-25-schwimmen-auf-dem-See';  
        $ersetzung = '(Stück)';  
        $ergebnis = preg_replace('~(\D+\d+)(\D+)~', '\\1'.$ersetzung.'\\2', $string);
        

        Ich habe nun meinem Muster gesagt "mindestens eine (das Pluszeichen) Nicht-Ziffer, gefolgt von mindestens einer Ziffer in Klammer 1 merken".

        In meinem ersten Vorschlag hatte ich noch den Anfang (^-Zeichen) und das Ende ($-Zeichen) eingetragen, da aus Deinem ersten Posting anscheinend nur ein einziges Vorkommen gemeint war. Nach Deiner Antwort auf Ashura hin zu schließen ist dem wohl nicht so...

        Wenn Du nun feste Stringbestandteile hast, dann kann man anstatt \D ebendiese einsetzen (nur auf Zeichen mit besonderen Bedeutungen achten).

        Neues Beispiel:

         $string = 'Das kostet €123456,25 bei mir.';  
        $ersetzung = ' (günstig, nicht wahr?!)';  
        $ergebnis = preg_replace('~(€\d+(?:[.,]\d+)?)( bei mir)~', '\\1'.$ersetzung.'\\2', $string);
        

        Zeichen innerhalb von eckigen Klammern werden als Alternativen für ein einzelnes Zeichen verstanden. In meinem neuen Beispiel kann also auch eine Dezimalzahl mit Komma oder Punkt gefunden werden. Ein Fragezeichen bedeutet "höchstens einmal, also auch keinmal", und ermöglicht damit Ganzzahlen, als auch Dezimalzahlen, da der gesamte Ausdruck in der zweiten Klammer (die wegen des "?:" nicht behalten wird) nicht vorkommen muss, aber kann.

        Liebe Grüße aus Ellwangen,

        Felix Riesterer.

  2. Hallo hanns.

    ich habe in einem dokument mehrere strings der form:
    dddddddxxhhhh. also die ddddddd-komponente und die hhhh-komponente
    sind immer identisch, nur das xx variiert, weil es eine zahl ist.

    nun möchte ich NUR die xx kompentente durch xxbbb ersetzen, wobei
    bbb immer etwas konstantes ist ... wie kann ich das machen???

    $str_deine_zeichenkette = 'dddddddxxhhhh';  
      
    $str_deine_zeichenkette = [link:http://de2.php.net/manual/en/function.str-replace.php@title=str_replace]('hhhh', 'bbbhhhh', $str_deine_zeichenkette);  
      
    echo $str_deine_zeichenkette; // dddddddxxbbbhhhh
    

    Einen schönen Freitag noch.

    Gruß, Ashura

    --
    sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
    „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
    [HTML Design Constraints: Logical Markup]
    1. hallo und vielen dank,

      ich glaube, dass ich mein problem nicht ganz klar geschildert habe.

      also ich habe sagen wir folgenden text, wobei x immer für eine ziffer steht:

      dlkfjdlkfj dddxxhhh jhhh kdjf kdjf kjk ddd  kdj fkddd klj lkhhh dddxhhh kdjkjddd kkljddd lökjhhhhhh dddxxxxxhhh kjkdjkj hhh xxx lkjlkj xx lkjlkjxxxxx

      nun möchte ich, dass NUR diejenigen xx bzw. xxxxx etc. ersetzt werden, die direkt von ddd und hhh umgeben sind. alle anderen nicht.

      also dddxxxhhh beispielsweise soll ersetzt werden durch dddxxxERSETZUNGSTEXThhh