Php 调整youtube url以嵌入解析器以删除附加内容

Php 调整youtube url以嵌入解析器以删除附加内容,php,regex,Php,Regex,我使用以下php代码自动将youtube URL转换为视频: $search = '% (?:https?://)? (?:www\.)? (?: youtu\.be/ | youtube\.com (?: /embed/ | /v/ | /watch\?v= | /watch\?feature=player_embedded&v= ) ) ([

我使用以下php代码自动将youtube URL转换为视频:

    $search = '%
    (?:https?://)?
    (?:www\.)?
    (?:
      youtu\.be/
    | youtube\.com
      (?:
        /embed/
      | /v/
      | /watch\?v=
      | /watch\?feature=player_embedded&v=
      )
    )
    ([\w\-]{10,12})
    \b
    %x';

    $replace = "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/$1\" data-youtube-id=\"$1\" frameborder=\"0\" allowfullscreen></iframe>";

return preg_replace($search, $replace, $url);
$search='%
(?:https?:/)?
(?:www\)?
(?:
youtu\.be/
|youtube\.com
(?:
/嵌入/
|/v/
|/观察\?v=
|/watch\?feature=player\u嵌入式&v=
)
)
([\w\-]{10,12})
\b
%x′;
$replace=“”;
返回preg_replace($search,$replace,$url);

删除视频id后的任何内容最简单的方法是什么?

哇。建议的链接实际上链接到另一个正则表达式。使用
parse_url
parse_str
,这就是它们的用途,请参阅。用正则表达式解析URL,没有理由重新发明轮子

多亏了别人的链接,我找到了一种方法,这里有一个功能可以搜索文本正文并用视频替换所有youtube链接:

function youtube($body)
{   
    $video_pattern = '~(?:http|https|)(?::\/\/|)(?:www.|)(?:youtu\.be\/|youtube\.com(?:\/embed\/|\/v\/|\/watch\?v=|\/ytscreeningroom\?v=|\/feeds\/api\/videos\/|\/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[a-z0-9;:@#?&%=+\/\$_.-]*~i';

    preg_match_all($video_pattern, $body, $matches);
    //print_r($matches[0]);

    foreach ($matches[0] as $url)
    {
        if (strpos($url, 'feature=youtu.be') == TRUE || strpos($url, 'youtu.be') == FALSE ) 
        {
            parse_str(parse_url($url, PHP_URL_QUERY), $id);
            $id = $id['v'];
        } 
        else 
        {
            $id = basename($url);
        }

        $body = str_replace($url, "<iframe class=\"youtube-player\" width=\"550\" height=\"385\" src=\"http://www.youtube.com/embed/{$id}\" data-youtube-id=\"{$id}\" frameborder=\"0\" allowfullscreen></iframe>", $body);
    }

    return $body;
}
function($body)
{   
(3:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",;
preg_match_all($video_pattern,$body,$matches);
//打印($matches[0]);
foreach($将[0]匹配为$url)
{
if(strpos($url,'feature=youtu.be')==TRUE | | strpos($url,'youtu.be')==FALSE)
{
parse_str(parse_url($url,PHP_url_QUERY),$id);
$id=$id['v'];
} 
其他的
{
$id=basename($url);
}
$body=str_replace($url,“,$body);
}
返回$body;
}

请提供一个您试图实现的输出示例。您使用的是最好的方法。这考虑到了几乎所有可以获取的youtube URL的情况。当尝试获取URL的一部分时,我总是尝试使用php的
parse_URL
,在某些情况下,它比regexp更健壮。@LiamDawe我没有意识到,从你的问题中,你总是可以使用正常的URL regex解析器,它通常工作得很好,然后运行
parse_url
获取参数。可能更容易我不是直接输入链接,而是从一个更大的文本体中获取链接,所以我不能只解析它。@LiamDawe-好吧,这更有意义,你能在你的问题中提到这一点吗?我仍然建议使用一个“更轻”的正则表达式来查找URL,然后使用parse_URL,但这实际上是您的要求。根据您找到URL的位置,您可能需要匹配的不仅仅是
\?v=
\?feature=…&v=
,例如,您需要相应地更改regex
/v/?foo=bar&v=
也是一个有效的youtube URL。添加了我自己的答案:)