PHP Regex preg_replace将youtube URL转换为嵌入URL版本


PHP Regex preg_replace to convert youtube URL to embed URL version

我像这样使用preg_replace,但存在以下问题:

$pattern = '#http(s)://(www'.)?youtube'.com/watch'?v=([^ &'n]+)(&.*?('n|'s))?.+#i';
$replacement = 'http://www.youtube.com/v/$3';
$final = preg_replace($pattern, $replacement, 'http://www.youtube.com/watch?v=Bf3iBtURGxk');
echo $final; 

输出http://www.youtube.com/watch?v=Bf3iBtURGxk[根本不起作用]

$final = preg_replace($pattern, $replacement, 'https://www.youtube.com/watch?v=Bf3iBtURGxk');
echo $final; 

输出http://www.youtube.com/v/Bf3iBtURGx[有效!但截断最后一个字符!]

$pattern = '#https?://(?:www'.)?youtube'.com/watch'?v=([0-9a-z]+)#i';
$replacement = 'http://www.youtube.com/v/$1';
$final = preg_replace($pattern, $replacement, 'http://www.youtube.com/watch?v=Bf3iBtURGxk'); 
echo $final;

演示

(..)包围字符不会使其成为可选字符。这就是为什么第一个带有http协议的yrl不匹配的原因。附加?使其可选:

http(s) -> http(s)?

v=之后出现字母和数字。您可以使用'w来匹配字母表、数字('w也匹配_,但在这种情况下问题不大)

$pattern = '#http(s)?://(www'.)?youtube'.com/watch'?v=('w+)#i';