2009-05-25 93 views
1

我建設應解析這樣的UBB標籤一個博客:PHP爆炸()沒有找到分隔符

輸入:<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> 

我的功能是非常簡單的,到目前爲止,因爲我已經陷入了最簡單的部分!現在,我有一個調用差異過程函數的主過程函數。在這種情況下,其中之一是processYouTubeVideos()。所以,我把它稱爲像這樣:

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

processYouTubeVideos()從YouTube的標籤完全內收到的網址,但由於某些原因,使用爆炸時,()(或拆分)的分隔符沒有找到。即使使用像「U」或「管」的測試值...

function processYouTubeVideos ($str) { 

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

    return $params[0]; 

} 
+0

與問題無關,但您可能需要查看parse_str()而不是自己分割字符串 – 2009-05-25 22:55:34

回答

3

嘗試:

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

,你嘗試運行將無法正常工作的代碼,因爲在功能輸出字符串將在目標模式而不是輸出上被調用。這意味着你正在向該函數傳送「\ 1」。將var_dump($str);添加到該函數的開頭,然後再次運行您的代碼,您將清楚地看到這一點。

preg_replace有一個特殊的標誌「e」,您可以使用它來執行每次進行替換時的功能。這可以通過將子模式插入標記位置($ 1),然後在代碼上運行諸如eval()create_function()來執行並檢索結果。然後發送回preg_replace()並進行實際更換。

0

processYouTubeVideos(「\ 1」)函數正在運行之前 eregi_replace。

下面做什麼,我相信你打算:

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

它進行更換,然後將結果值processYouTubeVideos。