2013-01-12 67 views
1

我已經找到了正常的YouTube網址的YouTube ID。但是我沒有想到簡短的youtu.be網址,我也不知道如何過濾YouTube-Id的視頻。據我知道有這類YT-網址可供選擇:preg_match找出YouTube ID

youtube.com/watch?v=0zM3nApSvMg &功能= feedrec_grec_index

youtube.com/user/IngridMichaelsonVEVO#p/a/u/ 1/QdK8U-VIH_o

youtube.com/v/0zM3nApSvMg?fs=1 & HL = EN_US &相對= 0

youtube.com/watch?v=0zM3nApSvMg#t=0m10s

的YouTube的.com /嵌入/ 0zM3nApSv ?鎂的rel = 0

youtube.com/watch?v=0zM3nApSvMg

youtu.be/0zM3nApSvMg

我發現這在另一個問題,但它不工作:

/^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/ 

所以我的問題是:我如何編輯下面的代碼,始終獲得YouTube-ID返回?! ;)

非常感謝!

add_filter('embed_oembed_html', 'my_embed_oembed_html', 99, 4); 
function my_embed_oembed_html($html, $url, $attr, $post_id) { 
    $posttext = substr($url[0],1); 
    preg_match('/v\=([a-zA-Z0-9,-]+)/', $url, $youtubeID); 

    return '<div id="video" class="border-frame"><video class="video" data-settings="autoresize:fit" preload="none" data-youtube-id="' . $youtubeID[1] . '"></video></div>'; 
} 
+0

這似乎是一個** PHP /'preg_match()**問題,*不*一個WordPress **問題。 –

+0

感謝您的快速回答。我可以提出這個問題嗎? – Philipp

+0

這真是一個PHP問題。移動它可能有意義。 –

回答

1
add_filter('embed_oembed_html', 'my_embed_oembed_html', 99, 4); 
function my_embed_oembed_html($html, $url, $attr, $post_id) { 
    $posttext = substr($url[0],1); 
    preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $youtubeID); 

    return '<div id="video" class="border-frame"><video class="video" data-settings="autoresize:fit" preload="none" data-youtube-id="' . $youtubeID[1] . '"></video></div>'; 
} 
+0

偉大的Giri!你給了我正確的提示。 (?:youtube(?: - nocookie)?\。com /(?:[^/]+/.+/ |(?:v | e(?:mbed)?)/ |。 * [?&] v =)| youtu \ .be /)([^「&?/] {11})%i',$ url,$ youtubeID);' – Philipp

2

事實上,你可能會考慮不使用正則表達式。 PHP有很多內置的函數可以幫助你。例如,嘗試下面的代碼:

$urls = array(
    'youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index', 
    'youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o', 
    'youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0', 
    'youtube.com/watch?v=0zM3nApSvMg#t=0m10s', 
    'youtube.com/embed/0zM3nApSvMg?rel=0', 
    'youtube.com/watch?v=0zM3nApSvMg', 
    'youtu.be/0zM3nApSvMg' 
); 

function displayId($url, $id) { 
    echo "URL: ", $url, "\n"; 
    echo "ID: ", $id, "\n\n"; 
} 

foreach ($urls as $url) { 

    $u = parse_url($url); 

    parse_str($u['query'], $queryVars); 

    if ($u['query'] && $queryVars['v']) { 
     displayId($url, $queryVars['v']); 
    } else if ($u['fragment']) { 
     displayId($url, basename($u['fragment'])); 
    } else if ($u['path']) { 
     displayId($url, basename($u['path'])); 
    } 
} 

這將產生以下的輸出:

URL: youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index 
ID: 0zM3nApSvMg 

URL: youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o 
ID: QdK8U-VIH_o 

URL: youtube.com/v/0zM3nApSvMg?fs=1&hl=en_US&rel=0 
ID: 0zM3nApSvMg 

URL: youtube.com/watch?v=0zM3nApSvMg#t=0m10s 
ID: 0zM3nApSvMg 

URL: youtube.com/embed/0zM3nApSvMg?rel=0 
ID: 0zM3nApSvMg 

URL: youtube.com/watch?v=0zM3nApSvMg 
ID: 0zM3nApSvMg 

URL: youtu.be/0zM3nApSvMg 
ID: 0zM3nApSvMg 

的代碼可能是更強大的,但我認爲它給你的想法。 :)

乾杯。

+0

謝謝Matt!也許是更好的解決方案 – Philipp

+0

正則表達式有它們的位置,但是在我的書中,如果有更簡單,更易於閱讀和維護的功能以滿足您的目的,我只會使用這些功能。 –