使用preg_match解析youtube视频ID

J.C*_*J.C 63 php regex youtube parsing

我正在尝试使用preg_match解析youtube网址的视频ID.我在这个网站上找到了一个似乎有效的正则表达式;

(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+
Run Code Online (Sandbox Code Playgroud)

如图所示:

替代文字

我的PHP如下,但它不起作用(给出未知修饰符'['错误)...

<?
 $subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";

 preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);

 print "<pre>";
 print_r($matches);
 print "</pre>";

?>
Run Code Online (Sandbox Code Playgroud)

干杯

Ben*_*jam 228

这个正则表达式从我能找到的所有各种URL中获取ID ...可能还有更多,但我无法在任何地方找到它们的引用.如果您遇到一个不匹配的内容,请在网址上留言,我会尝试更新正则表达式以匹配您的网址.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
    $video_id = $match[1];
}
Run Code Online (Sandbox Code Playgroud)

以下是此正则表达式匹配的URL示例:(在给定的URL之后可能会有更多内容被忽略)

它也适用于具有相同选项的youtube-nocookie.com网址.

它还会从嵌入代码(iframe和object标签)中的URL中提取ID

  • 再次......你有代码样本吗?你正确使用它吗?我只是用你的URL测试它,它返回一个数组,在`$ match [1]`是''9ofSV-ATEB0'`,这是id. (3认同)

Gum*_*mbo 11

更好地使用parse_urlparse_str解析URL和查询字符串:

$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
$url = parse_url($subject);
parse_str($url['query'], $query);
var_dump($query);
Run Code Online (Sandbox Code Playgroud)

  • 我宁愿使用正则表达式来完成所有这一切 (3认同)

eye*_*hUp 8

我不得不处理这个几周前写的PHP类,结果是一个匹配任何类型的字符串的正则表达式:有或没有URL方案,有或没有子域,youtube.com URL字符串,youtu.be URL字符串和处理所有类型的参数排序.您可以在GitHub上查看它,或者只需复制并粘贴下面的代码块:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}
Run Code Online (Sandbox Code Playgroud)

为了解释正则表达式,这是一个溢出的版本:

/**
 *  Check if input string is a valid YouTube URL
 *  and try to extract the YouTube Video ID from it.
 *  @author  Stephan Schmitz <eyecatchup@gmail.com>
 *  @param   $url   string   The string that shall be checked.
 *  @return  mixed           Returns YouTube Video ID, or (boolean) false.
 */        
function parse_yturl($url) 
{
    $pattern = '#^(?:https?://)?';    # Optional URL scheme. Either http or https.
    $pattern .= '(?:www\.)?';         #  Optional www subdomain.
    $pattern .= '(?:';                #  Group host alternatives:
    $pattern .=   'youtu\.be/';       #    Either youtu.be,
    $pattern .=   '|youtube\.com';    #    or youtube.com
    $pattern .=   '(?:';              #    Group path alternatives:
    $pattern .=     '/embed/';        #      Either /embed/,
    $pattern .=     '|/v/';           #      or /v/,
    $pattern .=     '|/watch\?v=';    #      or /watch?v=,    
    $pattern .=     '|/watch\?.+&v='; #      or /watch?other_param&v=
    $pattern .=   ')';                #    End path alternatives.
    $pattern .= ')';                  #  End host alternatives.
    $pattern .= '([\w-]{11})';        # 11 characters (Length of Youtube video ids).
    $pattern .= '(?:.+)?$#x';         # Optional other ending URL parameters.
    preg_match($pattern, $url, $matches);
    return (isset($matches[1])) ? $matches[1] : false;
}
Run Code Online (Sandbox Code Playgroud)

  • @awoodland:没有任何疑问和感谢指出我可以将问题标记为重复. (3认同)

Mod*_*der 5

我从领导回答中完善了正则表达式.它还从所有各种URL中获取ID,但更准确.

if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
    $video_id = $match[1];
}
Run Code Online (Sandbox Code Playgroud)

此外,它正确处理错误的ID,超过11个字符.

http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF