2014-09-27 137 views
0

我使用了preg_replace这样,但具有下列问题:PHP正则表达式的preg_replace转换YouTube网址嵌入URL版本

$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 [作品!但截断最终字符!]

回答

0
$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; 

Demo

0

围绕字符(..)不会使其成为可选项。这就是为什么http协议的第一个yrl不匹配。追加?使其可选:v=卡梅斯字母和数字

http(s) -> http(s)? 

后。您可以使用\w匹配字母,数字(\w也匹配_,但不是一个大问题这种情况下)

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