2009-05-25 6 views
1

Ich bin ein Blog erstellen, die bbcode Tags wie diese analysieren sollte:PHP explode() nicht zu finden Begrenzer

Eingang: <youtube=http://www.youtube.com/watch?v=VIDEO_ID&feature=channel>
Ausgang:

<object width="400" height="245"> 
<param name="movie" value="http://www.youtube- nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0"></param> 
<param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param> 
<embed src="http://www.youtube-nocookie.com/v/VIDEO_ID&hl=en&fs=1&rel=0&showinfo=0" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="400" height="245"></embed> 
</object> 

Meine Funktion ist unglaublich einfach so weit, weil ich auf dem einfachsten Teil steckengeblieben bin! Im Moment habe ich eine Master-Prozessfunktion, die Differenzprozessfunktionen aufruft. In diesem Fall ist einer von ihnen processYouTubeVideos(). So nenne ich es etwa so:

$str = eregi_replace('\<youtube=([^>]*)\>', processYouTubeVideos("\\1"), $str); 

processYouTubeVideos() empfängt die URLs aus dem Inneren des youtube-Tag perfekt, aber aus irgendeinem Grund, wenn explodieren mit() (oder Split) das Trennzeichen wird nie gefunden. unter Verwendung von Testwerte auch wie „u“ oder „Schlauch“ ...

function processYouTubeVideos ($str) { 

    $params = explode("?", $str); 
    $params = explode("&", $params[1]); 

    return $params[0]; 

} 
+0

nicht mit der Frage verwandt, aber Sie könnten sich parse_str() ansehen, anstatt die Zeichenfolge selbst zu teilen –

+0

ereg_ * Funktionen sollten nicht mehr verwendet werden – Evert

Antwort

3

Versuchen:

$str = preg_replace('/<youtube=([^>]*)>/e', 'processYouTubeVideos("$1")', $str); 

Der Code, den Sie versuchen, wird nicht funktionieren, zu laufen, weil die Funktion auf der Die Ausgabezeichenfolge wird im Zielmuster und nicht in der Ausgabe aufgerufen. Das bedeutet, dass Sie "\ 1" literal an die Funktion senden. Fügen Sie am Anfang der Funktion var_dump($str); hinzu und versuchen Sie, den Code erneut auszuführen, und Sie werden dies deutlich sehen.

preg_replace verfügt über ein spezielles Flag "e", mit dem Sie bei jedem Austausch eine Funktion ausführen können. Dies funktioniert, indem Sie das Untermuster an der Markerposition ($ 1) einfügen und dann etwas wie eval() oder create_function() über den Code ausführen, um es auszuführen und das Ergebnis abzurufen. Dieser wird dann an preg_replace() zurückgeschickt und der eigentliche Austausch vorgenommen.

0

Die processYouTubeVideos ("\ 1") Funktion wird ausgeführt vor der eregi_replace.

Die folgende tut, was ich glaube, Sie beabsichtigen:

$str = eregi_replace('\<youtube=([^>]*)\>', "\\1", $str); 
$str = processYouTubeVideos($str); 

Es ist der Ersatz durch und sendet dann den resultierenden Wert zu processYouTubeVideos.