kann mir jemand bitte preg_replace anhand des praktischen Beispiels erklären?

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

  • kann mir jemand bitte preg_replace anhand des praktischen Beispiels erklären?

    Hallo,

    Ich würde gerne etwas mehr über preg_replace() methoden erfahren.

    folgendes Problem :

    ich habe :

    $x = "a";
    $y = "b";

    $text = "Buchstabe nummer eins ist [[x]] und buchstabe nummer 2 ist [[y]]";

    jetzt will ich das [[x]] durch $x und [[y]] durch $y ersetzt wird.

    das löse ich folgendermaßen:

    PHP-Code:
    $values= array('[[x]]' => $x'[[y]]' => $y);
        foreach (
    $values as $i => $j) {
        
    $text str_replace($i$j$text);

    jetzt will ich aber, wenn ich jetzt z.B. noch $z = "c"; einfüge und in $text noch [[c]] vorkommt, das es automatisch ersetzt wird ohne das ich mein array erweitern muss.

    folglich müsste ich [[*]] durch $* ersetzen, wobei * sowohl bei [[]] als auch bei $ der gleiche wert sein muss.

    ich weiss, das es mit preg_replace gelöst werden kann, jedoch verstehe ich die komplizierte erklärung aus der PHP Doku leider nicht.

    Kann mir jemand bitte helfen?

    danke im Voraus, und tolles forum btw

  • #2
    Hallo und willkommen im Forum,

    erklär mir mal bitte erstmal, warum dir die vielen Beispiele im Handbuch nicht reichen.

    Was die komplizierten Erklärungen angeht: PCRE ist ein komplexes Thema und da mussten wir alle mal durch. Aber sei versichert, dass sich die 2 Tage lohnen, in denen du damit rumprobieren solltest.

    Gruß,

    Amica
    Zuletzt geändert von AmicaNoctis; 16.06.2010, 19:28.
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Hallo,

      Weil nirgendwo nach variablem Inhalt gesucht wird, bzw unbekannter Inhalt der zwischen 2 bestimmten Zeichen / Zeichenketten steht.

      dankeschön

      Kommentar


      • #4
        PHP: Square brackets - Manual

        Die ersten 7 Absätze solltest du lesen und deine Versuche und Teilerfolge hier dokumentieren. Wenn du dann nicht weiter kommst, sehen wir weiter. Aber ich will jetzt erstmal Eigeninitiative sehen.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          Hallo,

          Vielen Dank schonmal

          na dann werd ich hier nach und nach editieren.

          also der Ausdruck nach dem ich suche ist wohl
          PHP-Code:
          "/[[+([a-zA-Z]{2,})+]]/" 
          jetzt muss ich nur noch den variablen Inhalt zwischen [[ und ]] herausfiltern.

          Leider habe ich hier keine Ahnung wie ich das tun soll.

          Ausserdem habe ich auch keine Ahnung ob der Ausdruck richtig ist, da mir der zweite Teil fehlt um es herauszufinden.

          EDIT :// zum debuggen hab ich das jetzt erstmal so versucht, aber er ersetzt nicht, ausserdem habe ich einen Fehler oben entdeckt :

          PHP-Code:
          $x "a";
          $y "b";
          $z "c";

          $text "@x@ @y@ @z@";

          $text preg_replace("/^@$([a-zA-Z]{2,})^@$/i""it worked"$text);

          echo(
          $text); 
          edit 2 ://

          so klappts :

          PHP-Code:
          $x "a";
          $y "b";
          $z "c";

          $text "@x@ @y@ @z@";

          $text preg_replace("/@(\w+)@/""it worked"$text);

          echo(
          $text);
          // Ausgabe dem entsprechend it worked it worked it worked 
          ich muss nur noch rausfinden wie ich dieses (\w+) auslesen kann...

          noch ein Edit ://

          das ich mit $1 arbeiten muss ist mir nun auch klar, bloß kann ich aus $1 keine variable variable machen ($$1).
          hier scheiter ich nun, weiter komm ich nicht.
          Zuletzt geändert von icecoldkilla; 16.06.2010, 21:20.

          Kommentar


          • #6
            Das $ vorn muss weg, das verankert den Ausdruck am Ende und macht daher am Anfang keinen Sinn.

            Die Ersetzung mit @ ist bestimmt eine Krücke, weil du nicht wusstest, dass [ und ] Sonderzeichen sind, welche du maskieren musst: \[ und \].

            Edit: Gespeicherte Subpatterns kann man auch mit \\ statt $ abrufen, was ich auch empfehle:

            PHP-Code:
            echo preg_replace("/f(o+)bar/""schm\\1bar""fooooooobar"); // => schmooooooobar 
            Zuletzt geändert von AmicaNoctis; 16.06.2010, 21:28.
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              Hallo,

              Ja das @ war nur eine Krücke, dankeschön

              und ich bin jetzt etwas weiter gekommen, kannst du mir vielleicht sagen wo nun mein Fehler ist ?


              hatte es schon oben dokumentiert

              bzw :

              jetzt bin ich bei

              PHP-Code:
              <?php

              $x 
              "a";
              $y "b";
              $z "c";

              $text "[x] [y] [z]";

              $text preg_replace("/\[(\w+)\]/""works"$text);

              echo(
              $text);
              ich weiss auch das ich mit $1 das (\w+) rausfiltern kann,
              jedoch kann ich mit $$1 keine variable variable aus $1 machen die dann beispielsweise auf $x zugreifen würde, sondern es wird $x ausgegeben als Text.

              Kommentar


              • #8
                Zitat von icecoldkilla Beitrag anzeigen
                jedoch kann ich mit $$1 keine variable variable aus $1 machen die dann beispielsweise auf $x zugreifen würde, sondern es wird $x ausgegeben als Text.
                Da solltest du mal bei preg_replace_callback nachsehen, obwohl ich das ganze Vorhaben für bedenklich halte. Das was du machen willst sieht nach einer unsauberen Behebung eines Designfehlers aus. Es gibt auch noch einen e-Modifier, der den Ersetzungsausdruck als PHP-Code evaluiert, aber das ist auch dirrrty, wenn du mich fragst.
                Zuletzt geändert von AmicaNoctis; 16.06.2010, 21:35.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Hi,

                  Dankeschön

                  PHP-Code:
                  $x "a";
                  $y "b";
                  $z "c";

                  $text "[x] [y] [z]";


                  $text preg_replace("/\[(\w+)\]/e""$$1"$text);

                  echo(
                  $text); 
                  Ausgabe : a b c

                  Kommentar


                  • #10
                    edit:
                    Hoppala, ich war doch nur zwei Stunden weg. Das nächste Mal mach ich erst einen Reload, bevor ich 'nen Post abschicke ...

                    Zitat von icecoldkilla Beitrag anzeigen
                    Hallo,

                    Ich würde gerne etwas mehr über preg_replace() methoden erfahren.

                    folgendes Problem :

                    ich habe :

                    $x = "a";
                    $y = "b";

                    $text = "Buchstabe nummer eins ist [[x]] und buchstabe nummer 2 ist [[y]]";

                    jetzt will ich das [[x]] durch $x und [[y]] durch $y ersetzt wird.

                    PHP-Code:
                    $values= array('[[x]]' => $x'[[y]]' => $y);
                        foreach (
                    $values as $i => $j) {
                        
                    $text str_replace($i$j$text);

                    jetzt will ich aber, wenn ich jetzt z.B. noch $z = "c"; einfüge und in $text noch [[c]] vorkommt, das es automatisch ersetzt wird ohne das ich mein array erweitern muss.

                    folglich müsste ich [[*]] durch $* ersetzen, wobei * sowohl bei [[]] als auch bei $ der gleiche wert sein muss.

                    ich weiss, das es mit preg_replace gelöst werden kann, jedoch verstehe ich die komplizierte erklärung aus der PHP Doku leider nicht.
                    Ich würde sagen, ohne üble Hacks kann das Problem NICHT mit preg_replace() gelöst werden.

                    Erstens kennt preg_replace() die Namen von Variablen nicht.
                    Zweitens scheitert eine allgemeine Mustersuche daran, dass nicht bekannt ist, welche dieser einbuchstabigen Variablen gerade im Script deklariert sind. Man könnte zwar etwas mit preg_replace_callback() oder preg_replace() und dem Modifikator "/e" stricken, aber das würde auf eine Art Hack hinauslaufen.

                    Die (halbwegs) saubere Variante ist die Erweiterung des Arrays:

                    PHP-Code:
                    $replace_me = array (
                        
                    'x' => $x,
                        
                    'y' => $y,
                        
                    'c' => $z,
                    );

                    $new_text preg_replace(
                        
                    '/\[\[([a-z])\]\]/e',
                        
                    'isset($replace_me["$1"]) ? $replace_me["$1"] : $0;',
                        
                    $old_text
                    ); 
                    Halbwegs sauber deshalb, weil "/e" eine versteckte Form von eval() ist. Eine Lösung mit preg_replace_callback() wäre die sicherere Variante.


                    Okay, dann weiter an der richtigen Stelle:

                    Zitat von icecoldkilla Beitrag anzeigen
                    Hi,

                    Dankeschön

                    PHP-Code:
                    $x "a";
                    $y "b";
                    $z "c";

                    $text "[x] [y] [z]";


                    $text preg_replace("/\[(\w+)\]/e""$$1"$text);

                    echo(
                    $text); 
                    Ausgabe : a b c
                    Und was glaubst du, passiert, wenn deine Variablen anders definiert wurden? Beispielsweise so:

                    PHP-Code:
                    // $x fehlt ganz ...
                    $y "b";
                    $z "boeser php-quellcode, der unanstaendige Sachen macht;"
                    "/e" ist gefährlich, wenn man keine Ahnung hat.
                    Und variable Variablen sollte man meiden.
                    Zuletzt geändert von fireweasel; 16.06.2010, 22:31.
                    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

                    Kommentar


                    • #11
                      Zitat von fireweasel Beitrag anzeigen
                      Das nächste Mal mach ich erst einen Reload, bevor ich 'nen Post abschicke ...
                      Trotzdem schön zu wissen, dass jemand in allen Punkten mit mir übereinstimmt.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar

                      Lädt...
                      X