2014-09-27 113 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'; 
相關問題