preg_replace & Funktion

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

  • preg_replace & Funktion

    Hi

    Ich habe mal wieder ein kleines Problem, und hoffe ihr könnt mir weiterhelfen.

    Da ich teilwörter bestimmt formatieren möchte und in die Datenbank schreiben möchte, verwende ich preg_replace mit einer funktion beim ersetzen. Das ganze sieht dann so aus:
    PHP-Code:
    $ersetzung $this->mfct('\\1''\\2''\\3'); 
    $this->text preg_replace($suchmuster$ersetzung$this->text); 
    Nun habe ich folgende zwei probleme, und hoffe ihr könnt mir da weiterhelfen:
    1. Er nimmt mit die Werte aus dem Suchmuster nicht mit. Wenn ich beim ersetzen einfach '\\1' mache, ersetzt er mir logischerweise den text mit dem ausgabewert. In der Funktion übergibt er jedoch \\1 statt dem Inhalt. Wie kann ich das ändern?

    2. Kann ich dies irgendwie der reihe nach ablaufen lassen? Ich möchte wie gesagt die Werte in die Datenbank schreiben, und dort dann die ID ausgeben. Also so würde dies dann ungefähr aussehen:
    PHP-Code:
    function mfct($text1$text2$text3) {
        
    //Hier kommt das Insert für die Datenbank.
        
    return '[meineID]'.mysql_insert_id().'[/meineID]';        

    Abgesehen davon, dass ich bei text 1 - 3 nicht den richtigen wert habe, funktioneirt es fast. Mein Problem ist, dass er nur einen Datenbankeintrag erstellt und somit auch immer nur diese eine ID ausgibt. Also wenn er im Text 5 einträge ersetzen muss fügt er nur einen in die Datenbank.

    Wie könnt ich mein Problem lösen?

    Habe mir auch überlegt mit preg_match_all zu arbeiten. Dies würde soweit auch gehen, bis auf dass das ich das Problem habe das ich nicht weiss wie ich dann '[meineID]'.mysql_insert_id().'[/meineID]' mit dem Teil im ganzen Text ersetzen lassen könnte. Mit str_replace würde es gehen. Jedoch ist hier das problem wenn es selbe Einträge gibt. also wenn wir im Text 5 mal "Hund" haben, kann ich ja nicht einfach ein str_replace machen da ich sonst bei jedem "Hund" nur "[meineID]1[/meineID]" hätte statt bei jedem hund die ID die er generiert hat in der Funktion für dieses Wort.

    Danke schonmal für eure Hilfe.

    Gruss

    Olli

  • #2
    Re: preg_replace & Funktion

    Können wir die beiden Aufgaben nacheinander abarbeiten?
    Also erst das Ersetzen und dann das Eintragen in die Datenbank?

    Original geschrieben von Olli4
    Da ich teilwörter bestimmt formatieren möchte und in die Datenbank schreiben möchte, verwende ich preg_replace mit einer funktion beim ersetzen. Das ganze sieht dann so aus:
    PHP-Code:
    $ersetzung $this->mfct('\\1''\\2''\\3'); 
    $this->text preg_replace($suchmuster$ersetzung$this->text); 
    Da stellt sich natürlich sofort die Frage: Was gibt $this->mfct() zurück?

    Weiter unten erfahren wir, dass es ein String ist, der aus einer ID besteht, die zwischen zwei gleichbleibende Strings geklebt wird. Das solltest du vor dem Aufruf von preg_replace() probeweise mal überprüfen:
    PHP-Code:
    function mfct($text1$text2$text3) {
        
    //Hier kommt das Insert für die Datenbank.
        
    return '[meineID]'.mysql_insert_id().'[/meineID]';        

    var_dump($ersetzung); 
    Nun habe ich folgende zwei probleme, und hoffe ihr könnt mir da weiterhelfen:
    1. Er nimmt mit die Werte aus dem Suchmuster nicht mit. Wenn ich beim ersetzen einfach '\\1' mache, ersetzt er mir logischerweise den text mit dem ausgabewert. In der Funktion übergibt er jedoch \\1 statt dem Inhalt.
    Suchmuster? $suchmuster? Was steht denn in $suchmuster?

    Die Funktion mysql_insert_id() gibt entweder eine Ganzzahl oder FALSE zurück. Also gibt deine Funktion sowas wie '[meineID]47110815[/meineID]' oder '[meineID][/meineID]' zurück. Dies ist der Ersetzungsstring, mit dem preg_replace() ein gefundenes Suchmuster überschreibt. Irgendwelche Backslashes mit Zahlen kommen hierbei aber nicht vor.
    Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

    Kommentar


    • #3
      Hi,

      PHP-Code:
      $ersetzung "$this->mfct('\\\\1', '\\\\2', '\\\\3')"
      falls Modifier e gesetzt ist, sonst preg_replace_callback() verwenden.

      LG

      Kommentar


      • #4
        Guten Abend

        Werde es morgen gleich ausprobieren danke.

        Denke das mit preg_replace_callback oder modifire e wird klappen aber sehe es dann morgen. Werde mich melden wenn das nicht geht. Was bedeutet denn e genau? In den meisten tutorials wird e nicht erwähnt.

        @fireweasel: Zu deinen Fragen. Nein ausser du findest eine Lösung wie es geht. Sagen wir ich habe ein Text wo 5 mal das Wort "Hund" vorkommt. Nun möchte ich das er eben dieses Wort alle 5 mal ersetzt und dabei in die Funktion geht. Denn in der Funktion soll pro wort was er ersetzt ein Datenbankeintrag erstellt werden, und das Wort dann so ersetzen "[meineID]ID AUS DEM INSERT[/meineID]". In der Funktion wird der Text nämlich nach einem bestimmten Prinzip formatiert und da die reihenfolge bleiben sollte, muss jedes wort das ersetzt wird direkt die richtige Datenbank eintrag ID bekommen. Hoffe ich konnte es soweit erklären.

        So wie es bisher ist, ersetzt er Hund mit [meineID]1[/meineID] das problem ist, trotz das es 5 mal vorkommt macht er mir nur einen Datenbank eintrag und gibt immer nur die ID1 vom ersten aus. Und genau dies soll geändert werden

        Gruss

        olli

        Kommentar


        • #5
          Original geschrieben von Olli4
          Was bedeutet denn e genau? In den meisten tutorials wird e nicht erwähnt.
          http://regexp-evaluator.de/tutorial/modifier/#eval

          Kommentar


          • #6
            Hi

            Danke an beide. Mit dem Modifire e hat nun alles geklappt. Auch der zweite DB Eintrag wurde erstellt. Alles wie es soll danke. Das Problem hats wohl gegeben, weil die Ersetzung schon nicht klappte.

            gruss

            Olli

            Kommentar


            • #7
              preg_replace_callback() wäre auch meine Funktion der Wahl ...

              ... Sagen wir ich habe ein Text wo 5 mal das Wort "Hund" vorkommt. Nun möchte ich das er eben dieses Wort alle 5 mal ersetzt und dabei in die Funktion geht. Denn in der Funktion soll pro wort was er ersetzt ein Datenbankeintrag erstellt werden, und das Wort dann so ersetzen "[meineID]ID AUS DEM INSERT[/meineID]". In der Funktion wird der Text nämlich nach einem bestimmten Prinzip formatiert und da die reihenfolge bleiben sollte, muss jedes wort das ersetzt wird direkt die richtige Datenbank eintrag ID bekommen. Hoffe ich konnte es soweit erklären.
              PHP-Code:
              class bewareOfTheDog {
                
              // ...

                /// Datenbank-Kram

                /// simulierte Datenbankabfrage
                // zum Testen von preg_replace_callback()
                
              function last_insert_rowid(
                  
              $data_to_insert ''
                
              ) {
                  static 
              $insert_id 0;
                  ++
              $insert_id;
                  return 
              $insert_id;
                }
                
                
              /// Beispielfunktion fuer echte Datenbankabfrage
                
              function last_insert_rowid_(
                  
              $data_to_insert ''
                
              ) {
                  
              $result mysql_query(
                      
              $this->_db// a mysql-db resource
                      
              sprintf('INSERT INTO your_table (your_column) VALUES (\'%s\')',
                          
              mysql_real_escape_string($data_to_insert)
                      )
                  );
                  if (!
              is_resource($result)) {
                    
              // in dem Fall wuerde mysql_insert_id() die ROWID des letzten
                    // erfolgreichen INSERTs zurückgeben, und das wollen wir ja nicht
                    // also Fehlerbehandlung
                    // und Fehler-Wert zurückgeben
                    
              return FALSE;
                  }
                  return 
              mysql_insert_id($result);
                }

                
              /// Suchen-und-Ersetzen-Kram

                /// callback-funktion
                
              function make_id(
                  
              $hits /// von preg_replace_callback geliefertes Treffer-Array
                
              ) {
                  
              // aus dem Trefferarray den passenden Eintrag herausziehen
                  
              $data_to_insert $hits[0];

                  
              // falls die Datenbankabfrage fehlschlaegt
                  
              $insert_id $this->last_insert_rowid($data_to_insert);
                  if (!
              is_int($insert_id)) {
                    
              // Fehlerbehandlung
                    // ...
                  
              }
                  return 
              "[meineID]${insert_id}[/meineID]";
                }
                
                
              ///
                
              function suchen_und_ersetzen(
                  
              $nadel '',
                  
              $heuhaufen ''
                
              ) {
                  
              $nadel '/' preg_quote($nadel'/') . '/';
                  return 
              preg_replace_callback($nadel, array($this'make_id'), $heuhaufen);
                }

              }

              /// Anwendung

              // der zu durchsuchende Text
              $hundehaufen 'Hund-Katze-Maus. Spitzpudeldackel.
              Kein Gnadenbrot für einen armen Hund.
              A Hund isser scho!
              Krummer Hund. Falscher Hund. Dicker Hund.
              Kalter Hund. Dummer Hund. Schlauer Hund.
              '
              ;

              // der zu findende Text
              $hund 'Hund';

              $botd = new bewareOfTheDog();

              // ...

              $ersetzt $botd->suchen_und_ersetzen($hund$hundehaufen);

              // Ersetzungsergebnis zum Test ausgeben
              echo $ersetzt
              Verschluckte Backslashes hat wie immer die Board-Software zu verantworten. Bei mir hat alles funktioniert.

              So wie es bisher ist, ersetzt er Hund mit [meineID]1[/meineID] das problem ist, trotz das es 5 mal vorkommt macht er mir nur einen Datenbank eintrag und gibt immer nur die ID1 vom ersten aus. Und genau dies soll geändert werden
              Siehe die Kommentare in meiner Beispielfunktion fuer echte Datenbankabfrage". Das Auswerten der Rückgabewerte von mysql_insertid() dürfte meistens erhellend sein. Außerdem ist es auch hilfreich, eventuelle Fehlermeldungen der Datenbank anzuzeigen.
              Zuletzt geändert von fireweasel; 10.03.2009, 11:35.
              Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

              Kommentar

              Lädt...
              X