Ankündigung

Einklappen
Keine Ankündigung bisher.

preg_replace gibt nur \1 zurück

Einklappen

Neue Werbung 2019

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

  • preg_replace gibt nur \1 zurück

    hallo zusammen,
    ich habe eine kleine klasse gebaut, die mir den code in eine tabelle schreibt, die zeilen nummeriert und den code highlightet...
    nun kam ich zu folgendem ergebnis:
    ich habe gleich nach anfang der funktion get_codetable einmal echo $code; gemacht, um zu sehen, was der funktion im preg_replace mitgegeben wurde.
    leider kam dabei nur \1 raus.
    hier der code:
    Code:
    $content = preg_replace ("/\[code\](.+?)\[\/code\]/isU", $this->get_codetable("\\1"), $content);
    was ist daran falsch?
    danke im vorraus.
    mfg,
    WasserDragoon.


  • #2
    Wann wird bei Deiner Konstruktion $this->get_codetable("\\1") ausgewertet?
    Direkt vor dem Aufruf von preg_replace.; einmal.
    Das willst Du wohl nicht. Du willst, dass es bei jedem "Treffer" des Suchmusters ausgewertet wird.
    Also als Zeichenkette übergeben wie bei eval. Und dann bei http://php.net/pcre unter Modifikatoren denjenigen raussuchen, der den zweiten Parameter als php Code auswertet.

    Kommentar


    • #3
      Das ist die falsche rangehensweise, du kannst die "Variablen" \1 die preg_replace dir liefert nicht für eine Funktions-Argument verwenden! Glaube ich zumindest. Mache lieber preg_match und ersetze die matches gezielt durch deine codetable().

      Wäre zumindest mein Vorschlag.

      Kommentar


      • #4
        anstatt dem e-modifier lieber preg_match_callback verwenden, gab auch mal nen thread hier dazu warum, aber den find ich graud auf die schnelle ned.

        mfg
        robo47
        robo47.net - Blog, Codeschnipsel und mehr
        | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

        Kommentar


        • #5
          ok aber ich hatte vorher mal einen ähnlichen code gefunden, der ging auch in dem schema und hat auch geklappt...
          es sucht ja alle [ code]...[/code ]'s und dann ersetzt er die mit get_codetable das hört sich doch nit falsch an.
          mfg,
          WasserDragoon.

          Kommentar


          • #6
            Doch Zergling, kann er.....

            $content = preg_replace ("/\[code\](.+?)\[\/code\]/isU", '$this->get_codetable(\'\\1\')', $content);

            So müsste es funktionieren

            Kommentar


            • #7
              Fast.
              PHP-Code:
              <?php

              $content 
              preg_replace ("/\[code\](.+?)\[\/code\]/ise"'$this->get_codetable(\'\\1\')'$content);

              // Oder mit pcre_callback_replace

              $content preg_replace_callback("/\[code\](.+?)\[\/code\]/is", array($this'get_codetable'), $content);
              Für callback_replace muss get_codetable nur so umgeschrieben werden, dass es das zweite Element des übergebenen Feldes benutzt.

              Kommentar


              • #8
                Krass, wußte ich nicht. Danke für den Hinweis (obwohl ichs unübersichtlich finde, dann lieber ein mehrzeiler

                Kommentar

                Lädt...
                X