[REGEX] Preg_replace -> ein Backreference Problemchen

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

  • [REGEX] Preg_replace -> ein Backreference Problemchen

    Hallo,

    ich habe ein einfaches preg_replace, Syntax funktioniert, aber ich habe ein Problem mit Backreferences, Der Code sieht grob so aus:

    PHP-Code:
    <?php
    function hier($var)
    die(
    $var):
    }
    preg_replace("#(2)#i","Blah blah ".hier("$1"), "Text h1 Text");

    ?>
    Was hier passiert, beim erfolgreichen finden der Expression soll diese durch etwas in einer Funktion ersetzt werden, der Aufruf findet mittels Backreference statt, es muss hier("$1") heißen und nicht hier($1) , weil $1 wohl nur als Variable und nicht als Backreference erkannt wird.
    Dummerweise bekomm ich dann aber auch in der Funktion "hier" auch nicht den Wert der Backreference sondern den String "$1"

    Gibt es da ne Lösung, wie ich den Inhalt der Reference an eine Variable übergebe?
    SQL Injection kitteh is...

  • #2
    Suchmuster-Modifikatoren e
    PHP-Code:
    <?php
    function hier($var) {
    die(
    $var):
    }

    print 
    preg_replace("#(2)#ie""Blah blah " hier("\\\\1"), "Text h1 Text");
    ?>
    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
    PHP Sicherheit
    PHPUnit[1-2]
    Professionelle Softwareentwicklung mit PHP 5
    Professionelle PHP 5-Programmierung

    Kommentar


    • #3
      Geht es auch ohne e? E ist ziemlich Böse.

      Es geht übrigens nicht, bekomme dann \1 raus
      Zuletzt geändert von Seikilos; 12.08.2005, 15:22.
      SQL Injection kitteh is...

      Kommentar


      • #4
        Original geschrieben von Seikilos
        Geht es auch ohne e? E ist ziemlich Böse
        Man muss wissen was man macht
        Zuletzt geändert von schlimmerfinger; 12.08.2005, 15:38.
        Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
        PHP Sicherheit
        PHPUnit[1-2]
        Professionelle Softwareentwicklung mit PHP 5
        Professionelle PHP 5-Programmierung

        Kommentar


        • #5
          Hab noch ein Edit, es geht nicht, bekomme \1 raus
          SQL Injection kitteh is...

          Kommentar


          • #6
            Also bei mir geht es.
            PHP-Code:
            <?php
            function hier($var) {
            return 
            $var;
            }

            print 
            preg_replace("#(h1)#i""Blah blah " hier('\\\\1'), "Text h1 Text");
            ?>
            Erst nach dem der Wert \\1 von der Funktion zurückgegeben wird, wird es mit
            der Referenz ersetzt.
            Zuletzt geändert von schlimmerfinger; 12.08.2005, 15:35.
            Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
            PHP Sicherheit
            PHPUnit[1-2]
            Professionelle Softwareentwicklung mit PHP 5
            Professionelle PHP 5-Programmierung

            Kommentar


            • #7
              Dann ist es aber schon zu spät, die Funktion muss den Wert, der Ihr übergeben wird, nutzen um was zurück zu geben, im Original sieht es so aus:

              PHP-Code:
               private function mlink($to){
                return 
              "'.\$path.'static/".$to.'/'.urlencode($this->entries[$to]).'.html';
               }

                private function 
              getArgs($value){
                 
              preg_match("#Titel: (.*)\n#i",$value,$match);
                 
                 
                 
              $this->body preg_replace("#int\((.+),(.+)\);#is","<a href=\"".$this->mlink('\\1')."\">$2</a>",$this->body);

              Der Wert wäre 5, in mlink kommt aber bei $to nur $1 oder \1 an und der Return wird nicht richtig ausgeführt
              SQL Injection kitteh is...

              Kommentar


              • #8
                Das Angebot steht Suchmuster-Modifikatoren e
                Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
                PHP Sicherheit
                PHPUnit[1-2]
                Professionelle Softwareentwicklung mit PHP 5
                Professionelle PHP 5-Programmierung

                Kommentar


                • #9
                  Moment, es wird verwirrend, ich hab bei Backreferences den Wert 1 übergeben, das war irreführend, hab den Wert 5 genommen, dabei kommt das raus:

                  PHP-Code:
                  return "'.\$path.'static/".$to.'/'.urlencode($this->entries[$to]).'.html'
                  Ergibt
                  "'.\$path.'static/5/.html';

                  Also die Variable scheint OK zu sein, aber der Haken ist, der Wert muss noch in einem Array entries einen Wert finden, was nicht klappt, mit dem Modifikator e bekomme ich :
                  Parse error: parse error, unexpected '<' in /www/htdocs/dummy/index.php(148) : regexp code on line 1
                  Fatal error: preg_replace() [function.preg-replace]: Failed evaluating code: <a href="'.$path.'static/5/.html">Containerarten</a> in /www/htdocs/dummy/index.php on line 148
                  Zuletzt geändert von Seikilos; 12.08.2005, 15:56.
                  SQL Injection kitteh is...

                  Kommentar


                  • #10
                    Irgendwie nimmt er keine <, \, : zeichen an
                    PHP-Code:
                    <?php
                    class Foo {
                        private function 
                    _mlink($href$value) {
                            return 
                    sprintf('<a href="%s">%s</a>'$href$value);
                        }
                        
                        public function 
                    run() {
                            
                    $str 'Hallo Welt!';
                            print 
                    preg_replace(
                                        
                    '/(hallo)\s*(welt)/ise',
                                        
                    '$this->_mlink(\'\\\\1\', \'\\\\2\')',
                                        
                    $str
                                    
                    );
                        }
                    }

                    $foo = new Foo();
                    $foo->run();
                    ?>
                    EDIT:
                    Es würde auch ohne e gehen, ich glaube Du hattest Recht
                    PHP-Code:
                    <?php
                    class Foo {
                        private function 
                    _mlink($href$value) {
                            return 
                    sprintf('<a href="%s">%s</a>'$href$value);
                        }
                        
                        public function 
                    run() {
                            
                    $str 'Hallo Welt!';
                            print 
                    preg_replace('/(hallo)\s*(welt)/is'$this->_mlink('\\1''\\2'), $str);
                        }
                    }

                    $foo = new Foo();
                    $foo->run();
                    ?>
                    Zuletzt geändert von schlimmerfinger; 12.08.2005, 16:55.
                    Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist davon überzeugt, dass er genug davon habe – René Descartes
                    PHP Sicherheit
                    PHPUnit[1-2]
                    Professionelle Softwareentwicklung mit PHP 5
                    Professionelle PHP 5-Programmierung

                    Kommentar


                    • #11
                      also es geht immernoch nicht.
                      Ich bin nun mittlerweile auf
                      preg_replace_callback gekommen, welches mir auch Probleme bereitet:
                      PHP-Code:
                       $this->body preg_replace_callback("#int\((.+),(.+)\);#is"
                      create_function('$matches','return \'<a href="\'.$this->mlink($matches[1]).\'">$matches[2]</a>\';')
                      ,
                      $this->body); 
                      Es kommt : Fatal error: Using $this when not in object context in /www/htdocs/dummy/index.php(148) : runtime-created function on line 1

                      Ich hab schon wieder ein Problem mit dem Objekt, anscheinend schmeckt ihm $this nicht
                      Und da es eine anonyme Funktion ist, will ich nicht extra ne Funktion definieren müssen
                      Zuletzt geändert von Seikilos; 13.08.2005, 13:48.
                      SQL Injection kitteh is...

                      Kommentar


                      • #12
                        Fatal error: code umbrechen, damit das horizontale gescrolle verschwindet.
                        danke.

                        Kommentar


                        • #13
                          Wie gewünscht
                          SQL Injection kitteh is...

                          Kommentar

                          Lädt...
                          X