Ankündigung

Einklappen
Keine Ankündigung bisher.

Umstellung auf php7 - Warning: preg_replace(): The /e modifier is no longer supported

Einklappen

Neue Werbung 2019

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

  • Umstellung auf php7 - Warning: preg_replace(): The /e modifier is no longer supported

    Hallo alle zusammen, ich bin neu hier und hoffe, dass ich das richtige Unterforum getroffen haben. Falls nicht, bitte ich um Nachsicht.

    Ich stelle meine Webseite gerade von php5 auf php7 um. Leider komme ich an einen Punkt nicht weiter. Ich habe eine Template Klasse. Unter php 5.6 lief diese fehlerfrei, muss jedoch aufgrund php7 umgestellt werden. Leider komme ich an dieser Stelle nicht weiter. Der Original Code ist folgender:

    PHP-Code:

    protected function replaceFunctions()
        {

            
    // Includes ersetzen ( {include file="..."} )
            
    while(preg_match("/".$this->leftDelimiterF."include file="(.*)\.(.*)"".$this->rightDelimiterF."/isUe"$this->template)) {
                
    $this->template preg_replace("/".$this->leftDelimiterF."include file="(.*)\.(.*)"".$this->rightDelimiterF."/isUe""file_get_contents(\$this->templateDir.'\\1'.'.'.'\\2')"$this->template);
            }


            
    // Kommentare löschen
            
    $this->template preg_replace("/".$this->leftDelimiterC."(.*)".$this->rightDelimiterC."/isUe"""$this->template);

            return  
    true;
        }  


        public function 
    loop($name$array) {

            
    /*
            Sucht nach Einträgen à la {loop=$name}{/loop} und sendet den Inhalt der Klammern an die Funktion loop_content()
            Dabei werden der Name, der "Loop String" und der Datenarray übergeben
            */

            
    $this->template preg_replace("/".'\{loop="'.$name.'"}'."(.*)".'\{\/loop\}'."/isUe""\$this->loop_content(\$name, '\$1', \$array)"$this->template);
        }




        public function 
    loop_content($name$string$array) {

            
    $output '';

            
    $string stripslashes($string); // Kleiner Fix für den String

            
    foreach($array as $rows) { // Hier geht er den Datenarray durch

                
    $string_tmp $string// Clone von $string, damit $string nicht überschrieben wird

                
    foreach($rows as $row) { // Einzelne Objekte werden durchgegangen
                    /*
                    Hier werden Werte à la {$name.key} mit den entsprechenden Werten aus dem Array ersetzt
                    */
                    
    $string_tmp str_replace($this->leftDelimiter.$name.".".key($rows).$this->rightDelimiter$row$string_tmp);
                    
    next($rows);    
                }

                
    $output .= $string_tmp;
            }

            return 
    $output;

        } 
    Bei diesem Code bekomme ich folgende Fehler...

    Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w0xxxxx/abc/test.de/class/template.php on line 207

    Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w0xxxxx/abc/test.de/class/template.php on line 212

    Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w0xxxxx/abc/test.de/class/template.php on line 225



    Folgendes habe ich bereits umgesetzt. Jedoch bin ich mir nicht sicher, ob dies so der richtige Weg ist...

    PHP-Code:

    protected function replaceFunctions() 
        { 

            
    // Neu für php 7 
            
    $this->template preg_replace_callback("/{include file="(.*)\.(.*)"}/",  
                        function (
    $treffer) { 
                            
    $aufruf $this->templateDir.''.$treffer[1].'.'.$treffer[2]; 
                            return 
    file_get_contents($aufruf); 
                        }, 
    $this->template); 

            
    // Kommentare löschen 
            
    $this->template preg_replace_callback("/<!--(.*)-->/",  
                        function (
    $treffer) {                         
                            return 
    str_replace($treffer[0], ""$treffer[0]); 
                        }, 
    $this->template); 

            return  
    true
        } 

    Wäre über Tipps und Hilfestellung dankbar.

    Viele Grüße
    Mike

  • #2
    und wo genau ist dein Problem?

    Kommentar


    • #3
      Die Funktion loop bringt den Fehler, welchen ich im Beitrag geschrieben habe. War sicher etwas blöd ausgedrückt. Ich denke, das diese Funktion auch mit einen callback ausgestattet werden muss, jedoch fehlt mir jeder Ansatz.

      Kommentar


      • #4
        Was genau machst du denn da?
        HTML Template bearbeiten?

        PHP-Code:
        // Kommentare löschen 
                
        $this->template preg_replace_callback("/<!--(.*)-->/"
        Das sieht mir fast wie eine Aufgabe für DOMdocument aus.

        Kommentar


        • #5
          Guten Morgen. Im html rufe ich einen loop auf. dieser wird wie folgt aufgerufen.

          PHP-Code:

          {loop="text"}
                <
          li>
                       <
          a href="{$text.url}">$text.link}</a>
                </
          li>
          {/
          loop

          Im php erfolgt der Aufruf per

          PHP-Code:

          $this
          ->template->loop("text"$daten); 
          Das Array Daten enthält folgende Werte:

          PHP-Code:

          $daten 
          = array();
          $daten[0]["url"] = "www.abc.de";
          $daten[0]["link"] = "abc";

          $daten[1]["url"] = "www.xyz.de";
          $daten[1]["link"] = "xyz"

          In der template.php (Klasse) wird das ganze bisher unter php 5 so aufgerufen...

          PHP-Code:

          public function loop($name$array) {

                  
          /*
                  Sucht nach Einträgen à la {loop=$name}{/loop} und sendet den Inhalt der Klammern an die Funktion loop_content()
                  Dabei werden der Name, der "Loop String" und der Datenarray übergeben
                  */

                  
          $this->template preg_replace("/".'\{loop="'.$name.'"}'."(.*)".'\{\/loop\}'."/isUe""\$this->loop_content(\$name, '\$1', \$array)"$this->template);


              }

          public function 
          loop_content($name$string$array) {

                  
          $output '';

                  
          $string stripslashes($string); // Kleiner Fix für den String

                  
          foreach($array as $rows) { // Hier geht er den Datenarray durch

                      
          $string_tmp $string// Clone von $string, damit $string nicht überschrieben wird

                      
          foreach($rows as $row) { // Einzelne Objekte werden durchgegangen
                          /*
                          Hier werden Werte à la {$name.key} mit den entsprechenden Werten aus dem Array ersetzt
                          */
                          
          $string_tmp str_replace($this->leftDelimiter.$name.".".key($rows).$this->rightDelimiter$row$string_tmp);
                          
          next($rows);    
                      }

                      
          $output .= $string_tmp;
                  }

                  return 
          $output;

              } 

          Nun wurde der Server seitens des Hosters auf php 7 umgestellt. Seit dieser Umstellung kommt folgender Fehler

          Code:
          Warning: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead in /www/htdocs/w0342123/abc.de/class/template.php on line 255
          Versuche bereits seit 2 Tagen eine Lösung zu finden, jedoch ist irgendwo der Wurm drin. Wenn der Bedarf besteht, kann ich auch die ganze template.php hier posten.

          Wäre über Hilfe sehr dankbar.

          Kommentar


          • #6
            Die Fehlermeldung sagt doch eh, was du machen musst. Wo ist das Problem?

            Kommentar


            • #7
              Zitat von hellbringer Beitrag anzeigen
              Die Fehlermeldung sagt doch eh, was du machen musst. Wo ist das Problem?
              Das ist richtig, dass die Fehlermeldung alles aussagt. Jedoch sind alle Versuche, das Problem abzustellen nicht von Erfolg gezeichnet. Daher meine Frage an das Forum.

              Kommentar


              • #8
                Zeig doch mal die Versuche.

                Kommentar


                • #9
                  PHP-Code:


                  public function Loop


                  ($name$array) {
                          
                  $this->array $array;
                          
                  $this->template preg_replace_callback('/{loop="' $name '"}(.*?){\/loop}/ms', array($this'eachCallback'), $this->template);


                          return 
                  $this;
                      }  


                      private function 
                  eachCallback($matches) {
                          foreach(
                  $this->array as $value) {
                              
                  $cache $matches[1];

                              foreach(
                  $value as $key => $subValue)
                                  
                  $cache str_replace($this->leftDelimiter $key $this->rightDelimiter$subValue$cache);    
                                  
                  $return .= $cache;
                          }


                          return 
                  $return;
                      } 
                  Jedoch bringt das Script die Meldung:

                  Code:
                  Notice:  Undefined variable: return in /www/htdocs/w0342123/abc.de/class/template.php on line 239
                  Notice:  Undefined variable: return in /www/htdocs/w0342123/abc.de/class/template.php on line 243
                  Es wird mit diesen Code zwar geloppt, jodoch werden Platzhalter nicht ersetzt.

                  Kommentar


                  • #10
                    Das ist doch ein komplett anderer Code als oben. Oben verwendest du die Funktion loop_content, und unten eachCallback.

                    Kommentar


                    • #11
                      Zitat von hellbringer Beitrag anzeigen
                      Das ist doch ein komplett anderer Code als oben. Oben verwendest du die Funktion loop_content, und unten eachCallback.
                      Richtig. Ich denke mal, das es eine Kombination aus beiden werden muss. Jedoch habe ich da null Ansatz, die beiden miteinander zuverschmelzen.

                      Kommentar


                      • #12
                        PHP-Code:
                        preg_replace("/".'\{loop="'.$name.'"}' 
                        Anmerkung: Wenn du dynamische Werte in einem Pattern nutzt, solltest du unbedingt preg_quote() verwenden. Sonst können dir Zeichen aus dem regex-Wortschatz, das Pattern zerschiessen. Stichwort: Kontextwechsel.
                        The string "()()" is not palindrom but the String "())(" is.

                        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                        PHP.de Wissenssammlung | Kein Support per PN

                        Kommentar


                        • #13
                          Du musst statt mit preg_replace php Code zu erzeugen eben eine Funktion als callback aufrufen.

                          Ohne konkretes Beispiel was du uns z.B. hier zeigen kannst: https://eval.in/
                          Wird dir niemand viel mehr dazu sagen können.

                          edit: whoops, hatte den Tab wohl schon ein bisschen länger offen, hatte das nach #7 verfasst. Nichts desto trotz wäre ein testbares Beispiel aber denke ich immernoch nicht verkehrt

                          Kommentar

                          Lädt...
                          X