2

次のような bbcode タグを解析するブログを作成しています。

入力:<youtube=http://www.youtube.com/watch?v=VIDEO_ID&feature=channel>
出力:

<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>

私の関数は今のところ信じられないほど単純です。現在、差分プロセス関数を呼び出すマスター プロセス関数があります。この場合、そのうちの 1 つが processYouTubeVideos() です。だから私はそれを次のように呼びます:

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

processYouTubeVideos() は youtube タグ内から完全に URL を受け取りますが、何らかの理由で、explode() (または分割) を使用すると区切り文字が見つかりません。「u」や「tube」などのテスト値を使用しても...

function processYouTubeVideos ($str) {

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

    return $params[0];

}
4

3 に答える 3

3

試す:

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

出力文字列の関数は出力ではなくターゲット パターンで呼び出されるため、実行しようとしているコードは機能しません。これは、文字どおり "\1" を関数に送信していることを意味します。関数の先頭に追加var_dump($str);して、コードをもう一度実行してみると、これがはっきりとわかります。

preg_replaceには、置換が行われるたびに関数を実行するために使用できる特別なフラグ「e」があります。これは、サブパターンをマーカー位置 ($1) に挿入し、コード上でeval()orのようなものcreate_function()を実行して実行し、結果を取得することで機能します。これが に返送されpreg_replace()、実際の交換が行われます。

于 2009-05-25T21:57:51.237 に答える
0

eregi_replace の前にprocessYouTubeVideos("\1") 関数が実行されています。

以下は、あなたが意図していると私が信じていることを行います:

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

置換を実行し、結果の値を processYouTubeVideos に送信します。

于 2009-05-25T22:05:20.783 に答える