我像这样使用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';