web-dev-qa-db-fra.com

PHP Regex pour obtenir un identifiant de vidéo youtube?

Quelqu'un peut-il me montrer comment obtenir l'identifiant YouTube sur une URL, quelles que soient les autres variables GET contenues dans l'URL?.

Utilisez cette vidéo par exemple: http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=related
Donc, entre v= et avant le prochain &

127
wesbos

tilisez parse_url () et parse_str () .

(Vous pouvez utiliser des expressions rationnelles pour à peu près n'importe quoi, mais il est très facile de faire une erreur, donc s'il y a PHP fonctions spécifiquement pour ce que vous essayez d'accomplir, utilisez-les.)

parse_url prend une chaîne et la découpe dans un tableau contenant de nombreuses informations. Vous pouvez travailler avec ce tableau ou vous pouvez spécifier l'élément que vous voulez comme second argument. Dans ce cas, nous nous intéressons à la requête, qui est _PHP_URL_QUERY_.

Nous avons maintenant la requête, qui est _v=C4kxS1ksqtw&feature=relate_, mais nous ne voulons que la partie après _v=_. Pour cela, nous nous tournons vers _parse_str_ qui fonctionne fondamentalement comme GET sur une chaîne. Il faut une chaîne et crée les variables spécifiées dans la chaîne. Dans ce cas, _$v_ et _$feature_ est créé. Nous ne sommes intéressés que par _$v_.

Pour plus de sécurité, vous ne voulez pas simplement stocker toutes les variables de _parse_url_ dans votre espace de noms (voir le commentaire de mellowsoon). Stockez plutôt les variables en tant qu'éléments d'un tableau, de sorte que vous puissiez contrôler les variables que vous stockez et que vous ne pouvez pas écraser par inadvertance une variable existante.

En mettant tout ensemble, nous avons:

_<?php
$url = "http://www.youtube.com/watch?v=C4kxS1ksqtw&feature=relate";
parse_str( parse_url( $url, PHP_URL_QUERY ), $my_array_of_vars );
echo $my_array_of_vars['v'];    
  // Output: C4kxS1ksqtw
?> 
_

Exemple de travail


Modifier:

hehe - merci Charles. Cela m'a fait rire, je n'ai jamais vu la citation de Zawinski:

Some people, when confronted with a problem, think ‘I know, I’ll use regular expressions.’ Now they have two problems. - Jamie Zawinski

291
Peter Ajtai
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $url, $matches);

Cela représentera

youtube.com/v/{vidid}
youtube.com/vi/{vidid}
youtube.com/?v={vidid}
youtube.com/?vi={vidid}
youtube.com/watch?v={vidid}
youtube.com/watch?vi={vidid}
youtu.be/{vidid}

Je l'ai légèrement amélioré pour prendre en charge: http://www.youtube.com/v/5xADESocujo?feature=autoshare&version=3&autohide=1&autoplay=1

La ligne que j'utilise maintenant est:

preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=v\/)[^&\n]+(?=\?)|(?<=v=)[^&\n]+|(?<=youtu.be/)[^&\n]+#", $link, $matches);
146
Anthony Leach

D'après le commentaire de bokor sur la réponse d'Anthony:

preg_match("/^(?:http(?:s)?:\/\/)?(?:www\.)?(?:m\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'>]+)/", $url, $matches);

$matches[1] contient le vidid

Allumettes:

Ne correspond pas:

  • www.facebook.com?wtv=youtube.com/v/vidid
92
Shawn

Ceci peut être très facilement accompli en utilisant parse_str et parse_url et est plus fiable à mon avis.

Ma fonction prend en charge les URL suivantes:

Comprend également le test sous la fonction.

/**
 * Get Youtube video ID from URL
 *
 * @param string $url
 * @return mixed Youtube video ID or FALSE if not found
 */
function getYoutubeIdFromUrl($url) {
    $parts = parse_url($url);
    if(isset($parts['query'])){
        parse_str($parts['query'], $qs);
        if(isset($qs['v'])){
            return $qs['v'];
        }else if(isset($qs['vi'])){
            return $qs['vi'];
        }
    }
    if(isset($parts['path'])){
        $path = explode('/', trim($parts['path'], '/'));
        return $path[count($path)-1];
    }
    return false;
}
// Test
$urls = array(
    'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player',
    'http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player',
    'http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player'
);
foreach($urls as $url){
    echo $url . ' : ' . getYoutubeIdFromUrl($url) . "\n";
}
32
Kus

SOLUTION Pour tout type de lien !!:

<?php
function get_youtube_id_from_url($url)  {
     preg_match('/(http(s|):|)\/\/(www\.|)yout(.*?)\/(embed\/|watch.*?v=|)([a-z_A-Z0-9\-]{11})/i', $url, $results);    return $results[6];
}


echo get_youtube_id_from_url('http://www.youtube.com/watch?var1=blabla#v=GvJehZx3eQ1$var2=bla');
      // or                   http://youtu.be/GvJehZx3eQ1 
      // or                   http://www.youtube.com/embed/GvJehZx3eQ1
      // or                   http://www.youtu.be/GvJehZx3eQ1/blabla?xyz
?>

sorties:GvJehZx3eQ1

25
T.Todua

corrigé en fonction de Comment valider les identifiants de vidéos youtube?

<?php

$links = [
    "youtube.com/v/tFad5gHoBjY",
    "youtube.com/vi/tFad5gHoBjY",
    "youtube.com/?v=tFad5gHoBjY",
    "youtube.com/?vi=tFad5gHoBjY",
    "youtube.com/watch?v=tFad5gHoBjY",
    "youtube.com/watch?vi=tFad5gHoBjY",
    "youtu.be/tFad5gHoBjY",
    "http://youtu.be/qokEYBNWA_0?t=30m26s",
    "youtube.com/v/vidid",
    "youtube.com/vi/vidid",
    "youtube.com/?v=vidid",
    "youtube.com/?vi=vidid",
    "youtube.com/watch?v=vidid",
    "youtube.com/watch?vi=vidid",
    "youtu.be/vidid",
    "youtube.com/embed/vidid",
    "http://youtube.com/v/vidid",
    "http://www.youtube.com/v/vidid",
    "https://www.youtube.com/v/vidid",
    "youtube.com/watch?v=vidid&wtv=wtv",
    "http://www.youtube.com/watch?dev=inprogress&v=vidid&feature=related",
    "youtube.com/watch?v=7HCZvhRAk-M"
];

foreach($links as $link){
    preg_match("#([\/|\?|&]vi?[\/|=]|youtu\.be\/|embed\/)([a-zA-Z0-9_-]+)#", $link, $matches);
    var_dump(end($matches));
}
12
lleitep3

Nous savons que l'ID vidéo a une longueur de 11 caractères et peut être précédé de v= ou vi= ou v/ ou vi/ ou youtu.be/. Donc, le moyen le plus simple de faire cela:

<?php
$youtube = 'http://youtube.com/v/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/vi/dQw4w9WgXcQ?feature=youtube_gdata_player
http://youtube.com/?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://www.youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?v=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtube.com/watch?vi=dQw4w9WgXcQ&feature=youtube_gdata_player
http://youtu.be/dQw4w9WgXcQ?feature=youtube_gdata_player';

preg_match_all("#(?<=v=|v\/|vi=|vi\/|youtu.be\/)[a-zA-Z0-9_-]{11}#", $youtube, $matches);

var_dump($matches[0]);

Et sortie:

array(8) {
  [0]=>
  string(11) "dQw4w9WgXcQ"
  [1]=>
  string(11) "dQw4w9WgXcQ"
  [2]=>
  string(11) "dQw4w9WgXcQ"
  [3]=>
  string(11) "dQw4w9WgXcQ"
  [4]=>
  string(11) "dQw4w9WgXcQ"
  [5]=>
  string(11) "dQw4w9WgXcQ"
  [6]=>
  string(11) "dQw4w9WgXcQ"
  [7]=>
  string(11) "dQw4w9WgXcQ"
}
9
Krzysiek

Ce qui suit fonctionnera pour tous les liens youtube

<?php
    // Here is a sample of the URLs this regex matches: (there can be more content after the given URL that will be ignored)
    // http://youtu.be/dQw4w9WgXcQ
    // http://www.youtube.com/embed/dQw4w9WgXcQ
    // http://www.youtube.com/watch?v=dQw4w9WgXcQ
    // http://www.youtube.com/?v=dQw4w9WgXcQ
    // http://www.youtube.com/v/dQw4w9WgXcQ
    // http://www.youtube.com/e/dQw4w9WgXcQ
    // http://www.youtube.com/user/username#p/u/11/dQw4w9WgXcQ
    // http://www.youtube.com/sandalsResorts#p/c/54B8C800269D7C1B/0/dQw4w9WgXcQ
    // http://www.youtube.com/watch?feature=player_embedded&v=dQw4w9WgXcQ
    // http://www.youtube.com/?feature=player_embedded&v=dQw4w9WgXcQ
    // It also works on the youtube-nocookie.com URL with the same above options.
    // It will also pull the ID from the URL in an embed code (both iframe and object tags)

$url = "https://www.youtube.com/watch?v=v2_MLFVdlQM";

    preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match);

    $youtube_id = $match[1];

echo $youtube_id;
    ?>
7
John Max

J'ai eu du contenu de publication que j'ai dû chiffrer pour obtenir l'identifiant Youtube. Il se trouvait sous la forme du code <iframe> fourni par Youtube.

 <iframe src="http://www.youtube.com/embed/Zpk8pMz_Kgw?rel=0" frameborder="0" width="620" height="360"></iframe>

Le motif suivant que j'ai obtenu de @rob ci-dessus. Le fragment fait une boucle foreach une fois les correspondances trouvées et, pour un bonus supplémentaire, je l'ai lié à l'image d'aperçu trouvée sur Youtube. Il pourrait potentiellement correspondre à plusieurs types de types d'intégration Youtube et d'URL:

$pattern = '#(?<=(?:v|i)=)[a-zA-Z0-9-]+(?=&)|(?<=(?:v|i)\/)[^&\n]+|(?<=embed\/)[^"&\n]+|(?<=‌​(?:v|i)=)[^&\n]+|(?<=youtu.be\/)[^&\n]+#';

preg_match_all($pattern, $post_content, $matches);

foreach ($matches as $match) {
    $img = "<img src='http://img.youtube.com/vi/".str_replace('?rel=0','', $match[0])."/0.jpg' />";
    break;
}

Profil de Rob: https://stackoverflow.com/users/149615/rob

4
Foxinni
(?<=\?v=)([a-zA-Z0-9_-]){11}

Cela devrait le faire aussi.

4
kyri
if (preg_match('![?&]{1}v=([^&]+)!', $url . '&', $m))
    $video_id = $m[1];
4
NullUserException

Je sais que le titre du fil fait référence à l'utilisation d'une expression rationnelle, mais, comme le dit la citation de Zawinski, je pense vraiment qu'éviter les expressions rationnelles est préférable ici. Je recommanderais plutôt cette fonction:

function get_youtube_id($url)
{
    if (strpos( $url,"v=") !== false)
    {
        return substr($url, strpos($url, "v=") + 2, 11);
    }
    elseif(strpos( $url,"embed/") !== false)
    {
        return substr($url, strpos($url, "embed/") + 6, 11);
    }

}

Je le recommande car l'ID des vidéos YouTube est toujours le même, indépendamment du style de l'URL, par exemple.

  • http://www.youtube.com/watch?v=t_uW44Bsezg
  • http://www.youtube.com/watch?feature=endscreen&v=Id3xG4xnOfA&NR=1
  • `Et autres forme Ulr dans laquelle le mot" embed/"est placé avant le Id ... !!

et cela pourrait être le cas pour les choses incorporées et iframe- ed.

2
DreamLordOneiros
$vid = preg_replace('/^.*(\?|\&)v\=/', '', $url);  // Strip all meuk before and including '?v=' or '&v='.

$vid = preg_replace('/[^\w\-\_].*$/', '', $vid);  // Strip trailing meuk.
2
pieter

Je viens de trouver ceci en ligne à l'adresse http://snipplr.com/view/62238/get-youtube-video-id-very-robust/

function getYouTubeId($url) {
// Format all domains to http://domain for easier URL parsing
str_replace('https://', 'http://', $url);
if (!stristr($url, 'http://') && (strlen($url) != 11)) {
    $url = 'http://' . $url;
}
$url = str_replace('http://www.', 'http://', $url);

if (strlen($url) == 11) {
    $code = $url;
} else if (preg_match('/http:\/\/youtu.be/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 1, 11);
} else if (preg_match('/watch/', $url)) {
    $arr = parse_url($url);
    parse_str($url);
    $code = isset($v) ? substr($v, 0, 11) : false;
} else if (preg_match('/http:\/\/youtube.com\/v/', $url)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 3, 11);
} else if (preg_match('/http:\/\/youtube.com\/embed/', $url, $matches)) {
    $url = parse_url($url, PHP_URL_PATH);
    $code = substr($url, 7, 11);
} else if (preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $url, $matches) ) {
    $code = substr($matches[0], 0, 11);
} else {
    $code = false;
}

if ($code && (strlen($code) < 11)) {
    $code = false;
}

return $code;
}
0
marcnyc

J'ai utilisé les données de réponse de Shawn mais généralisé et raccourci un peu la regex. La principale différence avec celui-ci est qu'il ne testera pas une URL Youtube valide, mais recherchera simplement un ID vidéo. Ce qui signifie qu'il retournera toujours un identifiant vidéo pour www.facebook.com?wtv=youtube.com/v/vidid. Fonctionne pour tous les cas de test, mais est un peu plus laxiste. Par conséquent, il produira un faux positif pour quelque chose comme https://www.Twitter.com/watch?v=vidid. Utilisez cette méthode si les données sont super inconsistantes, sinon utilisez une expression rationnelle plus spécifique ou parse_url() et parse_str().

preg_match("/([\?&\/]vi?|embed|\.be)[\/=]([\w-]+)/",$url,$matches);
print($matches[2]);
0
Syd Lambert

Je pense que vous essayez de faire cela.

<?php
  $video = 'https://www.youtube.com/watch?v=u00FY9vADfQ';
  $parsed_video = parse_url($video, PHP_URL_QUERY);
  parse_str($parsed_video, $arr);
?>
<iframe
src="https://www.youtube.com/embed/<?php echo $arr['v'];  ?>"
frameborder="0">
</iframe>
0
Wael Assaf