preg_replace

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

  • preg_replace

    ich versuche hier einen preg_replace anzuwenden, aber irgendwie will er nicht so wie ich will.

    hier mal mein versuch:
    PHP-Code:
     preg_replace('|<\?.*get_media\('.$mediaid.',[0-9]?,[0-9]?,[0-9]?,["'.$data.'"]?\)[.]*\?>|U',
                 '<? PB_Get_Media('.$mediaid.', 1, 0, ,0 "'.$data.'", 0, "", 0, 0, "", "", "", 0, "", "", 1)?>',
                      $text);
    Wenn ich mir jetzt den inhalt ausgeben lasse, ist er unverändert?!

    hier mal das was ich überhaupt ändern will.
    beispiel:

    ursprug:
    PHP-Code:
    <? get_media(279, 1, 0, 0, "<STRONG>Business Times</STRONG>"); ?>
    so soll es aussehen:
    PHP-Code:
    <? PB_Get_Media(279, 1, 0, 0, "<STRONG>Business Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>
    kann mir da jemand weiterhelfen?
    Ich bin für jeden Ansatz dankbar.
    Gruß Tim

  • #2
    eine Idee hab ich jetzt nicht, aber warum ersetzt du denn die Funktion nicht gleich richtig in der Datei?
    mfg
    marc75

    <Platz für anderes>

    Kommentar


    • #3
      aso ich hätten sagen sollten, das die werte aus einer datenbank kommen.
      Ich muss in jedem Feld wo get_media ... vorkommt PB_Get_Media ... ersetzen.
      Mit eben den oben erwähnten Erkänzugen bei PB_Get_Media.

      Kommentar


      • #4
        ich habe ein wenig weiter gestestet. und nun habe ich folgendes ergebniss.

        code:
        PHP-Code:
        $srting preg_replace("/<\?.*get_media\(([0-9]{1,3}),.*\"(.*)\".*\).*\?>/U",
                                   
        "/<\?.*PB_Get_Media(([0-9]{1,3}, 1, 0, ,0 \"(.*)\", 0, \"\", 0, 0, \"\", \"\", \"\", 0, \"\", \"\", 1).*\?>/U",
                                   
        $match[0]); 
        ergebniss:
        PHP-Code:
        "<?.*PB_Get_Media(([0-9]{1,3}, 1, 0, ,0 "(.*)", 0, "", 0, 0, "", "", "", 0, "", "", 1).*?>"
        er ersetz nun an den richtigen stellen, aber er nimmt den neuen teil als reinen string an.
        Zuletzt geändert von SOB22; 07.06.2004, 11:45.

        Kommentar


        • #5
          $mediaid und $data kommen aus der DB?
          die Daten kannst du auch direkt in der Seite wo die Funktion aufgerufen wird einfügen/füllen.

          nochmal wird generell pb_get_media benötigt oder manchmal auch get_media?

          Wenn nur die eine Funktion benötigt wird ist es performer die Funktion direkt dort einzufügen wo jetzt get_media steht. die beiden vars kannste auch dort füllen.

          bedenke das preg_replace auch rechenzeit braucht
          mfg
          marc75

          <Platz für anderes>

          Kommentar


          • #6
            aber er nimmt den neuen teil als reinen string an.
            wie bitte?
            Die Zeit hat ihre Kinder längst gefressen

            Kommentar


            • #7
              es soll nur noch die Funktion PB_Get_Media verwendet werden.

              Das ganze ist eine einmalige Sache. die DB hat noch an einigen Stellen get_media anstatt PB_Get_Media stehen und das muss eben geändert werden. und da es sich um ca 1500 Datensätze handelt, ist das manuell zu erledigen, doch ein heiden aufwand.

              Kommentar


              • #8
                verstehe ich dich richtig das steht so in der DB:

                PHP-Code:
                <? PB_Get_Media('.$mediaid.', 1, 0, ,0 "'.$data.'", 0, "", 0, 0, "", "", "", 0, "", "", 1)?>
                mfg
                marc75

                <Platz für anderes>

                Kommentar


                • #9
                  aso nein also in der DB steht zB so etwas:

                  PHP-Code:
                  - <? get_media(360, 1, 0, 0, "Business Times vom 16.02.2003"); 
                  <br>?>- <? PB_Get_Media(359, 1, 0, 0, "The Gulf Times vom 
                  16.02.2003", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?><BR>- <? 
                  get_media(361, 1, 0, 0, "Abu Dhabi vom 19.02.2003"); ?>

                  Kommentar


                  • #10
                    ich habe es jetzt ein wenig weiter geschaft.

                    ich habe get_media durch PB_Get_Media ersetzt. und das auch an den richtigen Stellen mit den richtigen Werten.

                    Nur beim zurückschreiben der korrekten Daten in die DB habe ich ein Problem, bei mehrfachem vorkommen, von get_media in einem Datensart.

                    hier mal das SQL-Statement:

                    PHP-Code:
                    INSERT INTO c_tab1
                                  (text_1)
                                  VALUES
                                  ('<P><B></B>&nbsp;</P>
                    <P><B>iMOVE in der Presse</B></P>
                    <P>Juni 2003: <? PB_Get_Media(417, 1, 0, 0, "<STRONG>GATE</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>Mai 2003: <? PB_Get_Media(451, 1, 0, 0, "<STRONG>Review World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>Mai 2003: <? PB_Get_Media(454, 1, 0, 0, "<STRONG>Preview World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>

                    <P>24. März 2003: <? PB_Get_Media(458, 1, 0, 0, "<STRONG>Times of Oman</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>24. März 2003: <? PB_Get_Media(457, 1, 0, 0, "<STRONG>Oman Daily Observer</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>22. März 2003: <? PB_Get_Media(455, 1, 0, 0, "<STRONG>Times of Oman</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>19. März 2003: <? PB_Get_Media(456, 1, 0, 0, "<STRONG>Oman Daily Observer</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>März 2003: <? PB_Get_Media(260, 0, 0, 0, "<STRONG>CEDEFOP</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>

                    <P>Februar 2003: [B]<? PB_Get_Media("279", 1, 0, ,0 "<STRONG>Business Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>[/B]</P>
                    <P>Februar 2003: [B]<? PB_Get_Media("279", 1, 0, ,0 "<STRONG>Business Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>[/b]</P>
                    <P>November 2002: <? PB_Get_Media(152, 0, 0, 0, "<STRONG>BiBB News</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>April 2002: <? PB_Get_Media(149, 0, 0, 0, "<STRONG>Preview Magazine World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>')
                                  WHERE abschnittid = 350 
                    <br><b>1</b>INSERT INTO c_tab1
                                  (text_1)
                                  VALUES
                                  ('<P><B></B>&nbsp;</P>

                    <P><B>iMOVE in der Presse</B></P>
                    <P>Juni 2003: <? PB_Get_Media(417, 1, 0, 0, "<STRONG>GATE</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>Mai 2003: <? PB_Get_Media(451, 1, 0, 0, "<STRONG>Review World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>Mai 2003: <? PB_Get_Media(454, 1, 0, 0, "<STRONG>Preview World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>24. März 2003: <? PB_Get_Media(458, 1, 0, 0, "<STRONG>Times of Oman</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>

                    <P>24. März 2003: <? PB_Get_Media(457, 1, 0, 0, "<STRONG>Oman Daily Observer</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>22. März 2003: <? PB_Get_Media(455, 1, 0, 0, "<STRONG>Times of Oman</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>19. März 2003: <? PB_Get_Media(456, 1, 0, 0, "<STRONG>Oman Daily Observer</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>März 2003: <? PB_Get_Media(260, 0, 0, 0, "<STRONG>CEDEFOP</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>Februar 2003: [B]<? PB_Get_Media("280", 1, 0, ,0 "<STRONG>Gulf Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>[/B]</P>

                    <P>Februar 2003: [B]<? PB_Get_Media("280", 1, 0, ,0 "<STRONG>Gulf Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>[/B]</P>
                    <P>November 2002: <? PB_Get_Media(152, 0, 0, 0, "<STRONG>BiBB News</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>
                    <P>April 2002: <? PB_Get_Media(149, 0, 0, 0, "<STRONG>Preview Magazine World Education Market 2003</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?></P>')
                                  WHERE abschnittid = 350
                    Die fett markierten Bereiche sind die, die geändert wurden. Er führt das statement jetzt zwei mal aus, da get_media zwei mal vorkam. aber es so aussehen das er es einmal macht und am ende folgendes einträgt
                    PHP-Code:
                    <? PB_Get_Media("279", 1, 0, ,0 "<STRONG>Business Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>
                    <? PB_Get_Media("280", 1, 0, ,0 "<STRONG>Gulf Times</STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>
                    das skript:
                    PHP-Code:
                    $sql  = "SELECT text_1,
                                      abschnittid

                               FROM c_tab1

                               WHERE text_1 LIKE '%get_media%' ";

                      $result = PB_Set_SQL($sql, $conn);

                      while($row = PB_Get_Row($result))
                      {
                        $arr[] = array('text' => $row['text_1'],
                                       'id' => $row['abschnittid']);
                      }


                      $cnt = count($arr);
                      for($x=0; $x<$cnt; $x++)
                      {

                        preg_match_all("/<\?(.*)\?>/",$arr[$x]['text'],$match);

                        foreach($match[0] AS $k)
                        {

                          preg_match_all("/<\?.*get_media\(([0-9]{1,3}),.*\"(.*)\".*\).*\?>/U",$k,$matches);

                          if(!empty($matches[1]))
                          {
                            $cnt_all = count($matches[0]);

                            for ($i=0; $i<$cnt_all; $i++)
                            {

                              $id[$arr[$x]['id']][] = array('mediaid' => $matches[1][$i],
                                                            'data' => $matches[2][$i]);

                            }
                         }
                       }
                        $cnt_id = count($id[$arr[$x]['id']]);

                        // $inhalt = $match[0];
                        $inhalt = $arr[$x]['text'];

                        for ($y=0; $y<$cnt_id; $y++)
                        {
                          $mid = $id[$arr[$x]['id']][$y]['mediaid'];
                          $daten = $id[$arr[$x]['id']][$y]['data'];
                          $aid = $arr[$x]['id'];

                          $pattern = '/<\?.*get_media\(([0-9]{1,3}),.*\"(.*)\".*\).*\?>/U';
                          $replace = '<? PB_Get_Media("'.$mid.'", 1, 0, ,0 "'.$daten.'", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>';

                          $srting = preg_replace($pattern, $replace, $inhalt);

                          $sql = "INSERT INTO c_tab1
                                  (text_1)
                                  VALUES
                                  ('" . $srting . "')
                                  WHERE abschnittid = " . $aid . " ";

                          echo '<b>'.$y.'</b>'.$sql."\n<br>";


                          /*echo '<pre>';
                          var_dump($srting);
                          echo '</pre>';*/

                        }
                      }

                    Kommentar


                    • #11
                      hier mal das SQL-Statement:
                      OffTopic:

                      da hatte ich grad den regexp fertig ...
                      Die Zeit hat ihre Kinder längst gefressen

                      Kommentar


                      • #12
                        gibt es bei preg_replace eine Möglichkeit im zu sagen welchen Treffer er nehmen soll?
                        mit /U kann man ihm ja sagen er soll alle nehmen und ohne nimmt er nur den letzen.

                        kann man irgendwie in einer schleife sagen, bei ersten durchlauf nimm den ersten treffer, beim zweiten den zweiten usw. ?

                        Kommentar


                        • #13
                          Original geschrieben von SOB22
                          mit /U kann man ihm ja sagen er soll alle nehmen und ohne nimmt er nur den letzen.
                          nein, ohne /U wird der längste mögliche treffer genommen - greedy halt, im gegensatz zu ungreedy.
                          kann man irgendwie in einer schleife sagen, bei ersten durchlauf nimm den ersten treffer, beim zweiten den zweiten usw. ?
                          ich weiß nicht so ganz, worauf du hinauswillst, aber vielleicht schaust du dir ja mal preg_match_all an.
                          I don't believe in rebirth. Actually, I never did in my whole lives.

                          Kommentar


                          • #14
                            das ganz funktioniert jetzt ganz gut, danke dafür schonmal.

                            aber wenn jetzt in dem pattern ein sonderzeichen vorkommt, wie zB. hier das ':
                            PHP-Code:
                            <? PB_Get_Media(487, 1, 0, ,0 "<STRONG><SPAN style=[B]'[/B]TEXT-DECORATION: underline[B]'[/B]>Directory “Training Made in Germany - Training Providers at a Glance”</SPAN></STRONG>", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>
                            funktioniert das ganze nicht mehr.

                            ich habe es schon mit
                            PHP-Code:
                            $daten htmlentities($datenENT_QUOTES); 
                            bzw.
                            PHP-Code:
                            $daten str_replace("'""\'"$daten); 
                            hat beides leider nicht funktioniert. er escaped zwar zB die ', aber der preg_replace schlägt weiterhin fehl.

                            Kommentar


                            • #15
                              aso hier noch das soweit funktionierende skript, für alle die es interessiert.

                              PHP-Code:
                              for ($y=0; $y<$cnt_id; $y++)
                                  {
                                    $mid = $id[$arr[$x]['id']][$y]['mediaid'];
                                    $daten = $id[$arr[$x]['id']][$y]['data'];
                                    $aid = $arr[$x]['id'];

                                    $pattern = '/<|?.*get_media\('.$mid.',.*\"(.*)".*\).*\?>|U';
                                    $replace = '<? PB_Get_Media('.$mid.', 1, 0, ,0 "'.$daten.'", 0, "", 0, 0, "", "", "", 0, "", "", 1); ?>';

                                  }

                                    if(!empty($aid) && !empty($string))
                                    {
                                      $srting = preg_replace($pattern, $replace, $inhalt);


                                      $sql = "UPDATE c_tab1
                                              SET text_1 = '" . $srting . "'
                                              WHERE abschnittid = " . $aid . " ";

                                      PB_Set_SQL($sql, $conn);
                                    }

                              Kommentar

                              Lädt...
                              X