Heizer: preg_replace: Ergebnis in Array verwenden

Liebes Forum

Ich habe mir gedacht, ich könnte diese Funktion verwenden:
$c = preg_replace("/No(\d+)/e",$No["\1"],$c);

Also: Ich habe ein Array mit dem richtigen Inhalt, und im meinem String steht ein "No1". Jetzt möchte ich No1 durch $No[1] ersetzen, und ich dachte, daß ich durch den Modifikator /e dies tun könnte. Ich habe das \1 in allen möglichen Varianten probiert (einfache, doppelte, keine Anführungszeichen, ein, zwei, kein Backslash und auch $1) aber nichts funktioniert. Die Fehlermeldungen sind je nach dem unterschiedlich. Im obrigen Fall meldet PHP einfach, daß es kein Index \1 gäbe, was ja auch richtig ist.

Wie kann ich das machen? Geht es überhaupt in einem Ausdruck, oder muß ich da durch mehrere Schritte?

Danke und Grüße

Heizer

  1. Lieber Heizer,

    leider kann ich immer nur den Kopf schüttel, wenn jemand mit regulären Ausdrücken und PHP daherkommt: $c=str_replace("No1",$No[1],$c);

    Gruß aus Berlin!
    eddi

    1. leider kann ich immer nur den Kopf schüttel, wenn jemand mit regulären Ausdrücken und PHP daherkommt: $c=str_replace("No1",$No[1],$c);

      Leider kann ich immer nur den Kopf schütteln wenn ich mir hier so ein "Antwort" durchlese.

      Könnte es sein, daß ich der Übersichtlichkeitshalber die Funktion etwas einfacher geschrieben habe, als sie in wirklichkeit ist? Um mich auf das wesentliche zu beschränken, worum es in meiner Fragestellung geht? Ich kann natürlich auch die etwas 1MB Quellcode posten, die irgendwie mit diesem Problem zusammenhängen.

      Die Frage ist doch einfach, ob es *möglich* ist, dieses Ergebnis in einem Array als Schüssel zu verwenden.

      Einen schönen guten Morgen noch

      Heizer

      1. Hallo Heizer,

        leider kann ich immer nur den Kopf schüttel, wenn jemand mit regulären Ausdrücken und PHP daherkommt: $c=str_replace("No1",$No[1],$c);

        Leider kann ich immer nur den Kopf schütteln wenn ich mir hier so ein "Antwort" durchlese.

        Könnte es sein, daß ich der Übersichtlichkeitshalber die Funktion etwas einfacher geschrieben habe, als sie in wirklichkeit ist? Um mich auf das wesentliche zu beschränken, worum es in meiner Fragestellung geht?

        Könnte sein! Könnte es aber auch sein, daß manch anderer dahinter auch vermutet hätte, er hätte sich durch seine Fragestellung möglicherweise zu kurz ausgedrückt und würde dies mit einem Link auf den großen 1M-Code und einer eingehenderen Beschreibung aus dem Weg schaffen?

        Die Frage ist doch einfach, ob es *möglich* ist, dieses Ergebnis in einem Array als Schüssel zu verwenden.

        Mir ist nicht vollends klar was Du meinst; genaugenommen würde ich anhand Deiner Aussage vermuten, Du seist nicht in der Lage $a[str_replace("No1",$No[1],$c)] zu tippen...

        Gruß aus Berlin!
        eddi

        1. Die Frage ist doch einfach, ob es *möglich* ist, dieses Ergebnis in einem Array als Schüssel zu verwenden.

          Mir ist nicht vollends klar was Du meinst; genaugenommen würde ich anhand Deiner Aussage vermuten, Du seist nicht in der Lage $a[str_replace("No1",$No[1],$c)] zu tippen...

          ist das denn wirklich so schwer zu verstehen? Ich möchte in einem String nach bestimmten Werten suchen, und wenn diese Gefunden werden, den String durch einen anderen erstetzen, der anhand dieser Werte bestimmt wird.

          $c = preg_replace("/^.* (TL|TDL)(:| |)([a-zA-Z]{3,5})-?(\d{1,4}).* (PL|IPL)(:| |)([a-zA-Z]{3,5})-?(\d{1,4}) /e",sprintf($repl[strtolower(\1)][strtolower(\3)],\2,\4),$c);

          Eine von mir übernommene Datenbank soll auf diese Art verständliche Ausgaben produzieren.  Die Frage ist eben, wie ich es schaffe, mit den Ergebnissen \1 und \3 auf die entsprechenden Array-Schlüssel zuzugreifen und \2 und \4 für sprintf() zu verwenden. Ich dachte, daß ginge über den /e Modifikator, aber ich weiß nicht wie.

          Der Ausdruck ist immer noch etwas vereinfacht, da er erst ca 95% der Möglichkeiten abdeckt. Interessant wäre auch, wie man den Ausdruck so schreiben kann, daß er Teile in beliebieger Reihenfolge findet.

          Also einfach gesagt: Er soll "ab" und "ba" finden, aber nicht "aa" oder "bb". Ich weiß natürlich daß ich hier (ab|ba) schreiben könnte, aber wenn ich a und b durch komplexe Ausdrücke ersetze, dann wird das sehr sehr komplex. Wenn ich aber (a|b){2} schreibe, dann findet er eben auch "aa". Vielleicht weiß du da ja auch irgendeinen ganz einfach Trick...

          Grüße

          Heizer

          1. Hallo Heizer,

            Also einfach gesagt: Er soll "ab" und "ba" finden, aber nicht "aa" oder "bb". Ich weiß natürlich daß ich hier (ab|ba) schreiben könnte, aber wenn ich a und b durch komplexe Ausdrücke ersetze, dann wird das sehr sehr komplex. Wenn ich aber (a|b){2} schreibe, dann findet er eben auch "aa". Vielleicht weiß du da ja auch irgendeinen ganz einfach Trick...

            so banal das auch aussehen mag:

            Definition der zu ersetzenden Werte:

            $such=array(
                 'ww'=>'ab',
                 'WW'=>'ba',
                 'gb'=>'cd',
                 'bg'=>'dc');

            Definition der Basisdaten

            $data=hole_DB_data_als_array();

            Prüfen

            foreach($data as $key=>$value)
               foreach($such as $k=>$v)
                  $pruef[$key][$k]=str_replace($k,$v,$value);

            Egal wie die Daten zu ersetzen sind, nach "Prüfen" hast Du in Form des aufgebauten Datenfeld $pruef immer noch den Bezug zu allem, was bereits geschen ist.

            1.)  Für Anpassungen der Suche ist dies ein erheblich
                   einfacher zu haltendes Verfahren, das ohne Kom-
                   mentierung überschaubar bleibt.

            2.)  Für spätere Anpassungen halte ich es für nicht
                   Unerhelblich immer den Bezug innerhalb $pruef zu
                   haben.

            3.)  Mach mal ein Benchmark.

            Gruß aus Berlin!
            eddi

            1. Ich gebe zu, daß deine Lösung in vielen Fällen die einfachere sein wird. Aber es doch totzdem gut zu wissen, wie das mit dem /e nun funkioniert. schließlich gibt es ja doch viele Fälle, in denen es nun einmal eine RegExp sein muß.

              Grüße

              Heizer

  2. Huhu Heizer

    Ich habe mir gedacht, ich könnte diese Funktion verwenden:
    $c = preg_replace("/No(\d+)/e",$No["\1"],$c);

    Ich habe das \1 in allen möglichen Varianten probiert (einfache, doppelte, keine Anführungszeichen, ein, zwei, kein Backslash und auch $1) aber nichts funktioniert.

    Da hätteste Du doch nur die richtige Variante nehmen müssen ;-)

    $c = preg_replace("/No(\d+)/e",'$No[\1]',$c);

    Am besten aussen immer einfache Anführungen verwenden.
    Dann muss man die /s und $s nicht extra maskieren.

    Viele Grüße

    lulu

    --
    bythewaythewebsuxgoofflineandenjoytheday
    1. Huhu lulu

      Jetzt habe ich vorhin dein Posting glatt übersehen. Vielen Dank für die einfache Erklärung, es viel mir wie Schuppen von den augen, alles klar jetzt

      Herzlichst

      Heizer

      1. ich meinte natürlich "fiel", nicht "viel"

        Euer Läkasdäniga

        1. Huhu

          ich meinte natürlich "fiel", nicht "viel"

          und ich meinte "\s " und nicht "/s".

          Ist halt schnell passiert so ein Vertipper, aber wir bemühen uns weiter :-)

          Viele Grüße

          lulu

          --
          bythewaythewebsuxgoofflineandenjoytheday