harald: reg. Ausdrücke suchen & ersetzen

Hi!

Wie kann ich einen str. nach reg. Ausdrücken durchsuchen und diese dann ersetzen?

=> $string = "Dies ist ein 'Test'-String";
gesucht soll dann nach dem reg. Ausdruck "!'(.*)'!U" werden, ersetzt solln sie durch '"'.[vorheriges (.*)].'"' werden.

Wie kann ich das machen?

Danke
Harald

  1. Was du suchst ist preg_replace('Ausdruck','Ersetzen','Original-String'). Mittels $0-99 kannst du dann auf verschiedene Treffer zugreifen, wobei $0 für alles und $x für den Inhalt der x-ten Klammer steht. Diese "Variablen" sind allerdings als String im zweiten Argument abzuliefern.

    1. Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?

      lg
      harald

      1. Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?

        Das brauchst Du nicht, weil sich die Ersetzung nur auf die gefunden Teile beschränkt.

        Was soll Dein Code

        => $string = "Dies ist ein 'Test'-String";
        gesucht soll dann nach dem reg. Ausdruck "!'(.*)'!U" werden, ersetzt solln sie durch '"'.[vorheriges (.*)].'"' werden.

        bewirken? Eine Suche nach .*? findet in Deinem Beispiel alles. Ist das wirklich so gedacht? Vermutlich nicht. Wenn doch, reichen einfache Stringoperationen.

        1. ich suche ja nicht nach (.*), sondern nach '(.*)' => Text der in ' eingeklammert is, das is auch nur ein vereinfachtes Bsp., es geht darum dass ich Teile in einem str. mit reg. Ausdrück suchen & ersetzen will und danach den GANZEN str. mit den ersetzten teilen drinnen haben will...

          thx
          harald

          1. ich suche ja nicht nach (.*), sondern nach '(.*)' => Text der in ' eingeklammert is,

            Dein Suchausdruck war "!'(.*)'!U"

            Die ' habe ich übersehen, sorry. Trotzdem: Du mußt schon konkreter werden, was Du eigentlich willst, sonst wird Dir vermutlich keiner helfen können. Dein Ersetzungs-Pattern

            '"'.[vorheriges (.*)].'"'

            ist mir unverständlich. Schreib zumindest den Ausgangsstring (wenn nötig als Beispiel, das hast Du aber bereits getan) und den String, wie er am Ende aussehen soll. Dann ist es einfacher nachzuvollziehen.

            1. also ich hab folgenden txt
              str = "Hier kommt die ID:[id=276]";
              $str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);
              echo str;

              jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.

              Doch es passiert gar nix...

              lg
              harald

              1. Hi,

                also ich hab folgenden txt
                str = "Hier kommt die ID:[id=276]";
                $str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);

                Das 1-9 muss in eckige klammern. Momentan suchst du nach dem String "1-9". Wenn es vorkommen kann, dass die id eine 0 enthält (z.B. 205) müsstest du dann "[0-9]*" (oder kürzer "\d*") dafür schreiben.

                echo str;

                jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.
                Doch es passiert gar nix...

                Weil dein Muster nicht passt.

                mfG,
                steckl

                1. stimmt, jetzt wirds erkannt, aber den namen erkennt er so ned...

                  Wie kann ich den den Inhalt der var $1 in nem array nutzen?
                  => $id_namen[$1] funktioniert ned...

                  thx
                  Harald

                  1. Hi,

                    stimmt, jetzt wirds erkannt, aber den namen erkennt er so ned...

                    Wie kann ich den den Inhalt der var $1 in nem array nutzen?
                    => $id_namen[$1] funktioniert ned...

                    Ich kann nicht sehr gut PHP, aber es sollte doch so funktionieren, wie du oben geschrieben hast.
                    Wie sieht der komplette Aufruf aus und welches Fehlverhalten tritt auf?

                    mfG,
                    steckl

                    1. Es kommt kein fehler, er setzt nur nix ein...

                      lg
                      Harald

              2. also ich hab folgenden txt
                str = "Hier kommt die ID:[id=276]";
                $str = preg_replace("![id=(1-9*)]!U", '<a href="...?$1">'.$id_namen[$1].'</a>', $str);
                echo str;

                jetzt sollte "Hier kommt die ID:<a href="...?$1">Hannes</a>" erscheinen.

                Doch es passiert gar nix...

                Schon klar. Sind auch mehrere Fehler drin.

                preg_replace("/[(id=[1-9]*?)]/", ' <a href="...?$1">', $string)

                1. danke, doch das hab ich schon...
                  Aber wie kann ich denn das >'.$id_namen[$1].'< aus den Ersatz-String berichtigen?

                  Danke
                  Harald

                  1. danke, doch das hab ich schon...
                    Aber wie kann ich denn das >'.$id_namen[$1].'< aus den Ersatz-String berichtigen?

                    Danke
                    Harald

                    preg_match("/[id=([1-9]*?)]/", $str, $index);

                    $str = preg_replace("/[(id=[1-9]*?)]/", ' <a href="$1">' . $id_namen[$index[1]] . "</a>", $str);

                    1. Das ganze funktioniert dann aber nur bei einer ersetzung, nicht wenn der id-tag öffter vorkommt!

                      Geht das auch irgendwie für mehrere male?

                      1. Geht das auch irgendwie für mehrere male?

                        Vermutlich ja. Wenn man genauer wüßte, was Du vorhast, könnte man auch sagen, wie. So bleibt nur ein geratenes preg_match_all oder Schleifen.

                        1. naja, ich möchte eine Kommentareingabe anbieten, und dort soll man durch die Eingabe von [name=Hubert] auf z.B. die Seite von Hubert verlinken können, daher solln alle [name=(.*)] verarbeitet werden...

                          lg
                          Harald

                          1. naja, ich möchte eine Kommentareingabe anbieten, und dort soll man durch die Eingabe von [name=Hubert] auf z.B. die Seite von Hubert verlinken können, daher solln alle [name=(.*)] verarbeitet werden...

                            Mann, Dir muß man ja alles aus der Nase ziehen. Das ist immer noch nur eine halbwegs vernünftige Beschreibung. Wenn es darum geht, daß in einem Kommentarstring $comment die Zeichenfolge [name=.*?] öfter vorkommen kann, ist preg_match_all das Mittel der Wahl.

                            1. Entschuldige, ich dachte das ich eh schon mal geschrieben hab, dass es öfter ersetzt werden soll...

                              Stimmt das nun so?

                              preg_match_all("/[id=([1-9]*?)]/", $str, $index);
                              while($index as $replace)
                              $str = preg_replace("[id=".$replace[1]."]", ' <a href="'.$replace[1].'">' . $id_namen[$replace[1]] . "</a>", $str);

                              DANKE
                              Harald

      2. Hi,

        Da hab ich aber dann immer nur Teile, wie bekomm ich denn dann wieder alles vor, in, und nach den Klammern?

        Du musst alles was du wieder einsetzen willst in Klammern schreiben. Alles was nicht auf den regulären Ausdruck passt wird sowieso nicht geändert.

        Kannst du nochmal deinen Code mit preg_replace posten?

        Ausserdem solltest du statt nach '(.*)' vielleicht nach '(.*?)' suchen, da der Ausdruck sonst alles vom ersten bis zum letzten ' findet.
        Stichwort: gieriges Verhalten

        mfG,
        steckl