2009-05-25 53 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。