kointa: String durch URL ersetzen !?

Hi all,

ich wollte grad ein Skript bissle modifizieren, jedoch scheint das skript nur für str_replace ausgelegt zu sein.

Ich kann jedenfalls das ###URL### nicht durch eine URL ersetzen.
Hier mal der Code:

// Own Player  
  
define("OWN_WIDTH", 380);  
define("OWN_HEIGHT", 313);  
define("OWN_REGEXP", "/\[own ([[:print:]]+)\]/");  
define("OWN_TARGET", "<embed type=\"application/x-shockwave-flash\" height=\"".OWN_HEIGHT."\" width=\"".OWN_WIDTH."\" src=\"http://www.choiz.extra.hu/mediaplayer.swf?file=###URL###&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false\" loop=\"true\" quality=\"high\" bgcolor=\"#000000\" name=\"flvplayer\" align=\"middle\" allowScriptAccess=\"sameDomain\" allowFullScreen=\"true\" pluginspage=\"http://www.macromedia.com/go/getflashplayer\" /></embed>");  
  
function own_plugin_callback($match) {  
 $output = OWN_TARGET;  
 $output = str_replace("###URL###", $match[1], $output);  
 return ($output);  
}  
  
function own_plugin($content) {  
 return preg_replace_callback(OWN_REGEXP, 'own_plugin_callback', $content);  
}

Ich habe schon versucht anstatt

str_replace("###URL###", $match[1], $output);

das hier zu nehmen:

preg_replace("###URL###", $match[1], $output);

Aber es geht trotzdem nicht.

Ich habe schon gegoogelt aber irgedwie nichts gefunden, scheint wohl etwas komplizierter zu sein. wo könnte der fehler sein ?
ich muss dazu sagen dass ich in php neu bin, aber ich lerne schnell ;)

ich möchte als ergebnis zb. haben:
[own http://fsdf.de]

Hoffe mir kann da jdn helfen.
Vielen Dank schonmal !

kointa

  1. preg_replace("###URL###", $match[1], $output);
    Aber es geht trotzdem nicht.

    Kann sein preg_replace erwartet einen regulären Ausdruck als ersten Parameter. Du aber übergibst einen Stringliteral.

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
       <°)))o><                      ><o(((°>o
  2. (Hallo|Hi(ho)|Nabend) kointa,

    ich wollte grad ein Skript bissle modifizieren, jedoch scheint das skript nur für str_replace ausgelegt zu sein.

    Ich kann jedenfalls das ###URL### nicht durch eine URL ersetzen.

    Weil dein Script nicht nach "###URL###" sucht.

    // Own Player

    define("OWN_WIDTH", 380);
    define("OWN_HEIGHT", 313);

    Der folgende Reguläre Ausdruck  sucht nach '[own ...]', wobei du dir für ... alle möglichen druckbaren Zeichen (und davon mindestens eins) vorstellen musst:

    define("OWN_REGEXP", "/[own ([[:print:]]+)]/");

    Steht diese Kombination irgendwo in deinem zu durchsuchendem Text?

    define("OWN_TARGET", "<embed type="application/x-shockwave-flash" height="".OWN_HEIGHT."" width="".OWN_WIDTH."" src="http://www.choiz.extra.hu/mediaplayer.swf?file=###URL###&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>");

    Bääh, was für ein Umstand, extra für preg_replace_callback() eine Ersetzen-Funktion zu basteln. Im englischen Wort "replace" steckt doch das "Ersetzen" schon drin ...

    function own_plugin_callback($match) {
    $output = OWN_TARGET;
    $output = str_replace("###URL###", $match[1], $output);
    return ($output);
    }

    function own_plugin($content) {
    return preg_replace_callback(OWN_REGEXP, 'own_plugin_callback', $content);
    }

    
    >   
    > Ich habe schon versucht anstatt  
    >   
    > `str_replace("###URL###", $match[1], $output);`{:.language-php}  
    >   
    > das hier zu nehmen:  
    >   
    > `preg_replace("###URL###", $match[1], $output);`{:.language-php}  
    >   
    > Aber es geht trotzdem nicht.  
    
    Ja, klar, weil preg\_replace() damit nach '##URL##' sucht, und dieses Muster wird in deinem zu durchsuchenden Text nicht enthalten sein. Das erste und das letzte '#' wird dabei übrigens als RegExp-Begrenzerzeichen interpretiert.  
    
    >   
    > Ich habe schon gegoogelt aber irgedwie nichts gefunden, scheint wohl etwas komplizierter zu sein. wo könnte der fehler sein ?  
    > ich muss dazu sagen dass ich in php neu bin, aber ich lerne schnell ;)  
    
    Das ist gut. Dann lerne schnell [preg_replace()](http://de.php.net/manual/de/function.preg-replace.php) und [PCRE in PHP](http://de.php.net/manual/en/reference.pcre.pattern.syntax.php) anzuwenden. ;-)  
      
    
    > ich möchte als ergebnis zb. haben:  
    > [own http://fsdf.de]  
      
    Das Ergebnis ist weniger interessant. Um einen passenden RegEx zu erstellen, ist es wichtiger zu wissen, wonach preg\_replace() suchen soll.  
      
    MffG  
    EisFuX
    
    -- 
    [Nichts ist dem Zuwachs an Wissen förderlicher, als nach einer Antwort korrigiert zu werden.](http://community.de.selfhtml.org/zitatesammlung/zitat119)
    
    1. Weil dein Script nicht nach "###URL###" sucht.

      Also alle anderen funktionen funktionieren einwandfrei, habe in meinem beispiel nur den <embed> und den namen ersetzt !?!?

      hier mal der link zu dem plugin, vielleicht kannste dann erkennen wie ich meinen code verändern muss.
      Skript

      Steht diese Kombination irgendwo in deinem zu durchsuchendem Text?

      Also das Skript funktioniert so wie es aufgebaut ist, das ist ja nciht von mir, habe nur einen "SEVENLOAD" durch "OWN" ersetzt. daran kannst also irgendwie nicht liegen !?

      Bääh, was für ein Umstand, extra für preg_replace_callback() eine Ersetzen-Funktion zu basteln. Im englischen Wort "replace" steckt doch das "Ersetzen" schon drin ...

      Skript ist nicht von mir :( ;)

      Ja, klar, weil preg_replace() damit nach '##URL##' sucht, und dieses Muster wird in deinem zu durchsuchenden Text nicht enthalten sein. Das erste und das letzte '#' wird dabei übrigens als RegExp-Begrenzerzeichen interpretiert.

      Puh :D

      Das ist gut. Dann lerne schnell preg_replace() und PCRE in PHP anzuwenden. ;-)

      Werds versuchen :D Danke

      1. (Hallo|Hi(ho)|Tag) kointa,

        Also alle anderen funktionen funktionieren einwandfrei, habe in meinem beispiel nur den <embed> und den namen ersetzt !?!?

        Nun ja, manchmal ist es ganz gut, wenn man wenigstens grob nachvollziehen kann, was ein Script so tut, bevor man versucht, per
        Copy-N-Paste was Eigenes draus zu machen. ;-)

        hier mal der link zu dem plugin, vielleicht kannste dann erkennen wie ich meinen code verändern muss.
        Skript

        Herrjeh, sind alle Wordpress-Plugins so zusammengebastelt?

        Steht diese Kombination irgendwo in deinem zu durchsuchendem Text?

        Also das Skript funktioniert so wie es aufgebaut ist, das ist ja nciht von mir, habe nur einen "SEVENLOAD" durch "OWN" ersetzt.

        »»daran kannst also irgendwie nicht liegen !?

        Bääh, was für ein Umstand, extra für preg_replace_callback() eine Ersetzen-Funktion zu basteln.
        Im englischen Wort "replace" steckt doch das "Ersetzen" schon drin ...
        Skript ist nicht von mir :( ;)

        Gegen eine zusätzliche Callback-Funktion für preg_replace() ist ja nichts einzuwenden, wenn die Ersetzung etwas komplexer ist,
        aber den Ersetzungsstring nochmal zu durchsuchen und darin Teile zu ersetzen, erscheint mir irgendwie zu umständlich. Ich würde
        das eher so lösen:

          
        function own_plugin_callback($match) {  
          // dieser Wert wird benutzt, wenn keine Breite oder der Wert '0' angegeben wurde  
          static $default_width = '380';  
          // dito fuer die Hoehe  
          static $default_height = '313';  
          return '<embed type="application/x-shockwave-flash" height="' .  
            (empty($match[3]) ? $default_height : $match[3]) .  
            '" width="' .  
            (empty($match[2]) ? $default_width : $match[2]) .  
            '" src="http://www.choiz.extra.hu/mediaplayer.swf?file=' .  
            $match[1] .  
          '&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" ' .  
            'loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" ' .  
            'allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>';  
            // diese letzten drei Zeilen bitte zusammenfassen, ich hab die nur aufgeteilt,  
            // damit der Quelltext in (d|m)einem Editor  
            // etwas "uebersichtlicher" angezeigt wird.  
            // fuer das Forum hier ist er auch schon zu breit ...  
        }  
          
        function own_plugin($content) {  
          // moegliche BBCode-Muster: [own kurz-url] oder [own kurz-url breite hoehe]  
          // own kann groß- oder kleingeschrieben werden ("case insensitive")  
          return preg_replace_callback('/\[own\s+([^\]\s]+?)(?:\s+([0-9]+)\s+([0-9]+))?\]/iS', 'own_plugin_callback', $content);  
        }  
        
        

        Das ist gut. Dann lerne schnell preg_replace() und PCRE in PHP anzuwenden. ;-)
        Werds versuchen :D Danke

        Hier mal noch einige weitere hilfreiche Links zum Verständnis:
        * empty()
        * preg_replace_callback()
        * Unterschiede zwischen Stringliterale in einfachen und doppelten "Hochkommas"
        * Zeichenkettenoperator
        * Die Handbuchseite zu den Vergleichsoperatoren beschreibt kurz den Konditional- oder Trinitäts-Operator '?:'

        Wenn du dich dann noch mit der HEREDOC-Notation von Zeichenketten-Konstanten befasst hast, kannst du die Callback-Funktion auch anders schreiben:

          
        function own_plugin_callback($match) {  
          $width = !empty($match[2]) ? $match[2] : '380'; // dieser Wert wird benutzt,  
                                                          //wenn keine Breite oder der Wert '0' angegeben wurde  
          $height = !empty($match[3]) ? $match[3] : '313'; // dito fuer die Hoehe  
          $url = $match[1];  
          
          return <<<HTMLWUST  
        <embed type="application/x-shockwave-flash" height="$height" width="$width" src="http://www.choiz.extra.hu/mediaplayer.swf?file=$url&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>  
        HTMLWUST;  
        }
        

        MffG
        EisFuX

        1. Gegen eine zusätzliche Callback-Funktion für preg_replace() ist ja nichts einzuwenden, wenn die Ersetzung etwas komplexer ist,
          aber den Ersetzungsstring nochmal zu durchsuchen und darin Teile zu ersetzen, erscheint mir irgendwie zu umständlich. Ich würde
          das eher so lösen:

          function own_plugin_callback($match) {
            // dieser Wert wird benutzt, wenn keine Breite oder der Wert '0' angegeben wurde
            static $default_width = '380';
            // dito fuer die Hoehe
            static $default_height = '313';
            return '<embed type="application/x-shockwave-flash" height="' .
              (empty($match[3]) ? $default_height : $match[3]) .
              '" width="' .
              (empty($match[2]) ? $default_width : $match[2]) .
              '" src="http://www.choiz.extra.hu/mediaplayer.swf?file=' .
              $match[1] .
            '&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" ' .
              'loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" ' .
              'allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>';
              // diese letzten drei Zeilen bitte zusammenfassen, ich hab die nur aufgeteilt,
              // damit der Quelltext in (d|m)einem Editor
              // etwas "uebersichtlicher" angezeigt wird.
              // fuer das Forum hier ist er auch schon zu breit ...
          }

          function own_plugin($content) {
            // moegliche BBCode-Muster: [own kurz-url] oder [own kurz-url breite hoehe]
            // own kann groß- oder kleingeschrieben werden ("case insensitive")
            return preg_replace_callback('/[own\s+([^]\s]+?)(?:\s+([0-9]+)\s+([0-9]+))?]/iS', 'own_plugin_callback', $content);
          }

          
          >   
          >   
          > > > Das ist gut. Dann lerne schnell preg\_replace() und PCRE in PHP anzuwenden. ;-)  
          > > Werds versuchen :D Danke  
          >   
          > Hier mal noch einige weitere hilfreiche Links zum Verständnis:  
          > \* [empty()](http://de.php.net/manual/de/function.empty.php)  
          > \* [preg_replace_callback()](http://de.php.net/manual/de/function.preg-replace-callback.php)  
          > \* Unterschiede zwischen [Stringliterale](http://de.php.net/manual/de/language.types.string.php) in [einfachen](http://de.php.net/manual/de/language.types.string.php#language.types.string.syntax.single) und [doppelten](http://de.php.net/manual/de/language.types.string.php#language.types.string.syntax.double) "Hochkommas"  
          > \* [Zeichenkettenoperator](http://de.php.net/manual/de/language.operators.string.php)  
          > \* Die [Handbuchseite zu den Vergleichsoperatoren](http://de.php.net/manual/de/language.operators.comparison.php) beschreibt kurz den Konditional- oder Trinitäts-Operator '?:'  
          >   
          > Wenn du dich dann noch mit der [HEREDOC-Notation](http://de.php.net/manual/de/language.types.string.php#language.types.string.syntax.heredoc) von Zeichenketten-Konstanten befasst hast, kannst du die Callback-Funktion auch anders schreiben:  
          > ~~~php
            
          
          > function own_plugin_callback($match) {  
          >   $width = !empty($match[2]) ? $match[2] : '380'; // dieser Wert wird benutzt,  
          >                                                   //wenn keine Breite oder der Wert '0' angegeben wurde  
          >   $height = !empty($match[3]) ? $match[3] : '313'; // dito fuer die Hoehe  
          >   $url = $match[1];  
          >   
          >   return <<<HTMLWUST  
          > <embed type="application/x-shockwave-flash" height="$height" width="$width" src="http://www.choiz.extra.hu/mediaplayer.swf?file=$url&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>  
          > HTMLWUST;  
          > }
          
          

          MffG
          EisFuX

          boah cool DANKE, das ist doch mal ne super hilfe, echt big thx !!!!
          werd mich gleich mal dran setzen.

          1. function own_plugin_callback($match) {
              // dieser Wert wird benutzt, wenn keine Breite oder der Wert '0' angegeben wurde
              static $default_width = '380';
              // dito fuer die Hoehe
              static $default_height = '313';
              return '<embed type="application/x-shockwave-flash" height="' .
                (empty($match[3]) ? $default_height : $match[3]) .
                '" width="' .
                (empty($match[2]) ? $default_width : $match[2]) .
                '" src="http://www.choiz.extra.hu/mediaplayer.swf?file=' .
                $match[1] .
              '&backcolor=0x000000&frontcolor=0xCCCCCC&lightcolor=0x000000&screencolor=0x000000&searchbar=false&autostart=false" ' .
                'loop="true" quality="high" bgcolor="#000000" name="flvplayer" align="middle" allowScriptAccess="sameDomain" ' .
                'allowFullScreen="true" pluginspage="http://www.macromedia.com/go/getflashplayer" /></embed>';
                // diese letzten drei Zeilen bitte zusammenfassen, ich hab die nur aufgeteilt,
                // damit der Quelltext in (d|m)einem Editor
                // etwas "uebersichtlicher" angezeigt wird.
                // fuer das Forum hier ist er auch schon zu breit ...
            }

            function own_plugin($content) {
              // moegliche BBCode-Muster: [own kurz-url] oder [own kurz-url breite hoehe]
              // own kann groß- oder kleingeschrieben werden ("case insensitive")
              return preg_replace_callback('/[own\s+([^]\s]+?)(?:\s+([0-9]+)\s+([0-9]+))?]/iS', 'own_plugin_callback', $content);
            }

            
            > >   
              
            Habe es eben mal versucht, aber es geht leider nicht, ich habe die zeilen zusammengefügt wie du es geschrieben hast, aber im blog kommt nur "[own URL]" als text.  
              
            [Link zur fertigen php datei](http://www.choiz.extra.hu/embed-script.rar)  
              
            Sry dass ich es nicht selbst lösen kann, habe soweit alle anführungsstriche usw. überprüft, aber die syntax selbst sollte dir vertrauter sein ;). hoffe du kannst noch einen kurzen blick drauf werfen. wär klasse.  
              
            hast was gut bei mir ^^  
              
            grüße
            
            1. (Hallo|Hi(ho)|Tag|Mahlzeit) kointa,

              Habe es eben mal versucht, aber es geht leider nicht, ich habe die zeilen zusammengefügt wie du es geschrieben hast, aber im blog kommt nur "[own URL]" als text.

              Mhmm, bei mir hat es funktioniert -- allerdings ohne Wordpress, ich habe die Funktion nur auf einen Test-Text angesetzt.

              Link zur fertigen php datei

              Wie du dem Original-Plugin-Script entnehmen kannst, muss jede Plugin-Funktion noch registriert werden. Du solltest also meinem Script-Vorschlag (deswegen war's ja nur ein Vorschlag) auch noch folgende Zeilen hinzufügen:

                
              add_filter('the_content', 'own_plugin', 1);  
              add_filter('the_content_rss', 'own_plugin');  
              add_filter('comment_text', 'own_plugin');  
              
              

              Sry dass ich es nicht selbst lösen kann, habe soweit alle anführungsstriche usw. überprüft, aber die syntax selbst sollte dir vertrauter sein ;).

              Ein Editor mit Syntax-Highlighting kann in solchen Fällen sehr hilfreich sein.

              MffG
              EisFuX

              1. Wie du dem Original-Plugin-Script entnehmen kannst, muss jede Plugin-Funktion noch registriert werden. Du solltest also meinem Script-Vorschlag (deswegen war's ja nur ein Vorschlag) auch noch folgende Zeilen hinzufügen:

                add_filter('the_content', 'own_plugin', 1);
                add_filter('the_content_rss', 'own_plugin');
                add_filter('comment_text', 'own_plugin');

                
                >   
                  
                Super danke jetzt klappt es !!! Echt top dein support.  
                  
                
                > > Sry dass ich es nicht selbst lösen kann, habe soweit alle anführungsstriche usw. überprüft, aber die syntax selbst sollte dir vertrauter sein ;).  
                > Ein [Editor](http://www.pspad.com/) mit Syntax-Highlighting kann in solchen Fällen sehr hilfreich sein.  
                  
                  
                ich hab phase 5, der gefällt mir ganz gut.  
                  
                  
                grüße