Youtube API出现PHP语法错误:解析错误:语法错误,意外T_ENCAPSED_AND_WHITESPACE,期待T_STRING或T_VARIABLE或T_NUM_STRING

时间:2009-05-08 20:59:19

标签: php api youtube simplexml

我一直在第54行得到这个错误,我不知道为什么。 我所要做的就是处理查询结果的第一个条目:提取它的URL,以构建一个可嵌入的视频对象。

<?php
    function extractID($youtubeURL)
    {
        //split off the final bit of the URL beginning with ‘=’
        $youtubeID = strchr($youtubeURL,'=');
        //remove that equals sign to get the video ID 
        $youtubeID = substr($youtubeID,1);
        return $youtubeID;
    }
?>
<?php
    // set feed URL
    $lang = $_POST['language'];
    $query = $_POST['query'] . "%20review";
    switch($lang){
        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
            URL;
            break;
        case "French":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=fr
            URL;
            break;
        case "Spanish":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=es
            URL;
            break;                    
    }

    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);

    // get the first media entry &
   // get nodes in media: namespace for media information
   $media = $sxml->entry[0]->children('http://search.yahoo.com/mrss/');

   // get video player URL
   $attrs = $media->group->player->attributes();
   // **THIS KEEPS CAUSING THE ERROR.**
   $videoURL = $attrs['url'];
   // extract the video's ID from the URL
   $videoID = extractID($videoURL);       
?>

<?php
    echo <<<EOD 
    <objectwidth="425" height="350" data="http://www.youtube.com/v/
    <?php echo $videoID ?> 
    type="application/x-shockwave-flash"><param name="src" 
    value="http:/www.youtube.com/v/<?php echo $videoID ?>" /></object>
    EOD;
?>

2 个答案:

答案 0 :(得分:2)

您提供的PHP代码中的问题似乎是构建YouTube RSS Feed网址的部分内容。它看起来如下:

<?php
// set feed URL
$lang = $_POST['language'];
$query = $_POST['query'] . "%20review";
switch($lang){
    case "English":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=<?php echo $query; ?>
        &v=2
        &format=5
        &lr=en
        URL;
        break;
    case "French":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=<?php echo $query; ?>
        &v=2
        &format=5
        &lr=fr
        URL;
        break;
    case "Spanish":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=$query;
        &v=2
        &format=5
        &lr=es
        URL;
        break;
}

我可以看到有两件事是错误的:

  1. heredocs末尾的URL;行应缩进。它们应该类似于以下内容:

        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
    URL;
            break;
    
  2. 请勿在heredocs中使用<?php echo $query; ?>。只需使用$query,就像上面的case "Spanish":块一样。

  3. 修复这些heredoc后,你会发现代码不会做你想要的。 $feedURL会包含大量不需要的空格,这会导致您对simplexml_load_file的调用失败。但是,如果仔细查看供稿网址,您会注意到它们与最终的“语言代码”(enfres)完全相同。我会做的是使用一个将语言名称翻译成语言代码的数组,并使用它将语言代码附加到提要URL。例如,类似下面的内容应该有效:

    $lang_codes = array(
        "English" => "en",
        "French"  => "fr",
        "Spanish" => "es"
    );
    
    $feedURL = "http://gdata.youtube.com/feeds/api/videos?q=$&v=2&format=5&lr=" . $lang_codes[$lang];
    

    其余代码似乎有效。一旦我修复了获取RSS提要URL的问题,就可以非常愉快地获取提要,从中提取YouTube网址并获取视频ID。

答案 1 :(得分:-2)

问题是$ media-&gt;组是空的。它没有孩子。这意味着$ media-&gt; group-&gt;播放器为NULL。您不能在NULL上调用attributes(),因此会出现语法错误。