317 votes

Comment obtenir l'ID de la vidéo YouTube à partir d'une URL ?

Je veux obtenir le v=id à partir de l'URL de YouTube avec JavaScript (pas de jQuery, purement JavaScript).

Exemples de formats d'URL YouTube

http://www.youtube.com/watch?v=u8nQa1cJyX8&a=GxdCwVVULXctT2lYDEPllDR0LRTutYfW

http://www.youtube.com/watch?v=u8nQa1cJyX8

Ou tout autre format YouTube qui contient un identifiant vidéo dans l'URL.

Résultat de ces formats

u8nQa1cJyX8

1 votes

0 votes

Cette question ne concerne que les formats comme le mien. Mais j'y ai trouvé une réponse intéressante, merci de la partager.

0 votes

Il existe une expression régulière pour cela : http://pregcopy.com/exp/27

512voto

Lasnv Points 1341

J'ai fait une amélioration à Regex fourni par "jeffreypriebe" parce qu'il avait besoin d'une sorte de YouTube URL est l'URL des vidéos quand ils regardent à travers une chaîne.

Eh bien non, mais c'est la fonction que j'ai armée.

<script type="text/javascript">
function youtube_parser(url){
    var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#&?]*).*/;
    var match = url.match(regExp);
    return (match&&match[7].length==11)? match[7] : false;
}
</script>

Voici les types d'URLs supportés

http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o
http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg

On peut le trouver dans [http://web.archive.org/web/20160926134334/] http://lasnv.net/foro/839/Javascript_parsear_URL_de_YouTube

8 votes

L'expression contient un petit bug : \??v?= ? cela devrait juste être dans la partie de la montre, sinon vous filtreriez un 'v' si l'identifiant commence par un 'v'. donc ceci devrait faire l'affaire : /^.*((youtu.be\/)|(v\/)|(\/u\/) \w\ /)|(embed\/)|(watch\??v?= ?))([^#\&\ ?]*).*/

84 votes

Encore plus propre : /.*(?:youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=)([^#\&\?]*).*‌​/ Ensuite, utilisez match[1] au lieu de match[7] (ce qui me semble un peu arbitraire). Corrige également un bogue signalé par WebDev.

0 votes

/^.*((youtu.be\/)|(v\/)|(\/u\/) \w\ /)|(embed\/)|(watch\ ?))\??v?= ?([^#\&\?^ \s ]*).*/ ce qui le limitera jusqu'à l'espace " ", ce qui fera fonctionner certains textes. youtube.com/watch?v=S09F5MejfBE un autre texte

256voto

mantish Points 1181

J'ai un peu simplifié la réponse de Lasnv.

Il corrige également le bogue que WebDeb décrit.

C'est ici :

var regExp = /^.*(youtu\.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*/;
var match = url.match(regExp);
if (match && match[2].length == 11) {
  return match[2];
} else {
  //error
}

Voici un lien de regexer pour jouer avec : http://regexr.com/3dnqv

2 votes

Juste un avertissement : ceci ne devrait être utilisé que lorsque vous savez que vous avez affaire à une url youtube. Je l'ai utilisé (à tort) pour vérifier des url en tant que youtube, ce qui a provoqué des faux positifs, par exemple ceci passe : 'v/2059-9080-5437'.

4 votes

J'utilise maintenant une autre Regex qui vérifie également la présence d'un domaine youtube. Je ne sais pas si je dois mettre à jour la réponse car c'est un gros changement : /^.*(youtu.be\/|youtube(-nocookie) ?.com\/(v\/|.*u\/ \w\ /|embed\/|.*v=))([ \w -]{11}).*/

4 votes

Quand YouTube passera-t-il à 12 caractères pour l'identifiant de la vidéo ?

125voto

Jacob Relkin Points 90729

Vous n'avez pas besoin d'utiliser une expression régulière pour cela.

var video_id = window.location.search.split('v=')[1];
var ampersandPosition = video_id.indexOf('&');
if(ampersandPosition != -1) {
  video_id = video_id.substring(0, ampersandPosition);
}

0 votes

Il s'agit d'une fonction utile pour faire fonctionner le système là où vous le souhaitez en fonction de ce code. var video_url = ' youtube.com/watch?v=eOrNdBpGMv8&feature=youtube_gdata ' ; ytid(video_url) ; function ytid(video_url) { var video_id = video_url.split('v=')[1] ; var ampersandPosition = video_id.indexOf('&') ; if (ampersandPosition != -1) { video_id = video_id.substring(0, ampersandPosition) ; } alert(video_id) ; return video_id ; }.

14 votes

Ne gère pas les URL intégrées

27 votes

Ne gère pas non plus les urls générées par le "partage". https://youtu.be/{{video_id}}

26voto

jeffreypriebe Points 1070

Étant donné que YouTube a une variété de styles d'URL, je pense que Regex est une meilleure solution. Voici mon Regex :

^.*(youtu.be\/|v\/|embed\/|watch\?|youtube.com\/user\/[^#]*#([^\/]*?\/)*)\??v?=?([^#\&\?]*).*

Le groupe 3 a votre identifiant YouTube

Exemples d'URL YouTube (actuellement, y compris le style "legacy embed URL") - la Regex ci-dessus fonctionne sur toutes ces URL :

http://www.youtube.com/v/0zM3nApSvMg?fs=1&amp;hl=en_US&amp;rel=0
http://www.youtube.com/embed/0zM3nApSvMg?rel=0
http://www.youtube.com/watch?v=0zM3nApSvMg&feature=feedrec_grec_index
http://www.youtube.com/watch?v=0zM3nApSvMg
http://youtu.be/0zM3nApSvMg
http://www.youtube.com/watch?v=0zM3nApSvMg#t=0m10s
http://www.youtube.com/user/IngridMichaelsonVEVO#p/a/u/1/QdK8U-VIH_o

Conseil de chapeau à Lasnv

10 votes

Vous avez vraiment besoin de retourner à la planche à dessin avec celui-ci. Oui, il correspond correctement aux URLs ci-dessus. Mais il correspond également de manière erronée à de nombreuses autres chaînes de caractères non-youtube-url telles que : "domain.com/embed/file.txt" , "/tv/" y "Has anyone seen my watch?" . Voir : ma réponse à une question similaire pour une solution beaucoup plus précise.

1 votes

Je comprends votre point de vue : la regex ci-dessus est inutile pour répondre à la question "Est-ce une URL YouTube ?" mais ce n'était pas mon objectif. J'ai des URLs YouTube - je me contente d'extraire un ID. Oui, votre réponse est solide (et couvre un cas d'utilisation que la mienne ne couvre pas).

0 votes

Vous avez le même problème que j'ai mentionné ci-dessus avec les identifiants commençant par un 'v'.

19voto

Joakim Points 111

J'ai créé une fonction qui teste l'entrée d'un utilisateur pour les ID d'intégration de Youtube, Soundcloud ou Vimeo, afin de pouvoir créer un design plus continu avec des médias intégrés. Cette fonction détecte et retourne un objet avec deux propriétés : "type" et "id". Le type peut être soit "youtube", "vimeo" ou "soundcloud" et la propriété "id" est l'identifiant unique du média.

Sur le site, j'utilise une zone de texte où l'utilisateur peut coller n'importe quel type de lien ou de code d'intégration, y compris l'intégration iFrame de vimeo et de youtube.

function testUrlForMedia(pastedData) {
var success = false;
var media   = {};
if (pastedData.match('http://(www.)?youtube|youtu\.be')) {
    if (pastedData.match('embed')) { youtube_id = pastedData.split(/embed\//)[1].split('"')[0]; }
    else { youtube_id = pastedData.split(/v\/|v=|youtu\.be\//)[1].split(/[?&]/)[0]; }
    media.type  = "youtube";
    media.id    = youtube_id;
    success = true;
}
else if (pastedData.match('http://(player.)?vimeo\.com')) {
    vimeo_id = pastedData.split(/video\/|http:\/\/vimeo\.com\//)[1].split(/[?&]/)[0];
    media.type  = "vimeo";
    media.id    = vimeo_id;
    success = true;
}
else if (pastedData.match('http://player\.soundcloud\.com')) {
    soundcloud_url = unescape(pastedData.split(/value="/)[1].split(/["]/)[0]);
    soundcloud_id = soundcloud_url.split(/tracks\//)[1].split(/[&"]/)[0];
    media.type  = "soundcloud";
    media.id    = soundcloud_id;
    success = true;
}
if (success) { return media; }
else { alert("No valid media id detected"); }
return false;
}

0 votes

Bonne idée, mais elle ne fonctionne pas sur la grande majorité des formats d'URL. Y compris l'absence de correspondance sur les sites https.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X