为什么我得到两次查询

时间:2010-10-11 00:51:42

标签: php regex youtube

我正在尝试基本上提取youtube.com网址的?v =(查询部分)...当有人在youtube.com URI中输入时会自动嵌入视频(即有人会输入{ {3}},此程序自动将其嵌入页面中。

无论如何,当我运行以下代码时,我得到两个QUERY(ies)作为第一个URI:

<?php
//REGEX CONTROLLER:

//embedding youtube:
function youtubeEmbedd($text)
{
    //scan text and find:
        //  http://www.youtube.com/
        //  www.youtube.com/

$youtube_pattern = "(http\:\/\/www\.youtube\.com\/(watch)??\?v\=[a-zA-Z0-9]+(\&[a-z]\=[a-zA-Z0-9])*?)";      //  the pattern

    #"http://www.youtube.com/?v="

    echo "<hr/>";
    $links = preg_match_all($youtube_pattern, $text, $out, PREG_SET_ORDER);     // use preg_replace here

    if ($links)
    {
        for ($i = 0; $i != count($out); $i++) 
        {
            echo "<b><u> URL </b><br/></u> ";

            foreach ($out[$i] as $url)
            {
                // split url[QUERY] here and replaces it with embed code:
                $youtube = parse_url($url);
                echo "QUERY: " . $youtube["query"] . "<br/>";
                #$pos  = strpos($url, "?v=");
            }          
        }
    }    
    else
    {
        echo "no match";
    }
}

youtubeEmbedd("tthe quick gorw fox http://www.youtube.com/watch?v=5qm8PH4xAss&x=4dD&k=58J8 and http://www.youtube.com/?v=Dd3df4e ");

?>

输出是:

  

URL QUERY: v=5qm8PH4xAss QUERY: << WHY DOES THIS APPEAR???????????? URL QUERY: v=Dd3df4e

我会很乐意帮助你。

1 个答案:

答案 0 :(得分:2)

您的正则表达式将结果存储在$out中,如下所示:

(
    [0] => Array
        (
            [0] => http://www.youtube.com/watch?v=5qm8PH4xAss
            [1] => watch
        )

    [1] => Array
        (
            [0] => http://www.youtube.com/?v=Dd3df4e
        )

)

您的正则表达式有一个用于匹配文本watch的子组,因此最终会导致数组中的结果。

由于您遍历所有结果$out[$i],因此您尝试在第一个匹配的第二个结果上运行parse_url;这导致空输出。

要解决您的问题,只需将迭代更改为:

if($links){
    foreach($out as $result){
        $youtube = parse_url($result[0]);
        echo "<b><u> URL </b><br/></u> QUERY: " . $youtube["query"] . "<br/>";
    }
}