J'essaie d'analyser l'identifiant vidéo d'une URL youtube à l'aide de preg_match. J'ai trouvé sur ce site une expression régulière qui semble fonctionner;
(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+
Comme le montre cette photo:
Mon PHP est comme suit, mais cela ne fonctionne pas (donne l'erreur '[' du modificateur inconnu) ...
<?
$subject = "http://www.youtube.com/watch?v=z_AbfPXTKms&NR=1";
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
print "<pre>";
print_r($matches);
print "</pre>";
?>
À votre santé
Cette expression rationnelle saisit l'ID de toutes les différentes URL que j'ai pu trouver ... Il y en a peut-être d'autres, mais je n'ai trouvé aucune référence à ces adresses. Si vous rencontrez un problème qui ne correspond pas, veuillez laisser un commentaire avec l'URL. Je vais essayer de mettre à jour la regex pour qu'elle corresponde à votre URL.
if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})%i', $url, $match)) {
$video_id = $match[1];
}
Voici un exemple des adresses URL auxquelles cette expression rationnelle correspond: (il peut y avoir plus de contenu après l'URL donnée qui sera ignoré)
Il fonctionne également sur l'URL youtube-nocookie.com avec les mêmes options que ci-dessus.
Il va également extraire l'ID de l'URL dans un code incorporé (balises iframe et object)
J'ai dû composer avec cela pour une classe PHP que j'ai écrite il y a quelques semaines et qui s'est terminée avec une expression régulière qui correspond à n'importe quel type de chaîne: youtu.be Chaînes d'URL et traitement de tout type de tri de paramètres. Vous pouvez le vérifier sur GitHub ou simplement copier et coller le bloc de code ci-dessous:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @param $url string The string that shall be checked.
* @return mixed Returns YouTube Video ID, or (boolean) false.
*/
function parse_yturl($url)
{
$pattern = '#^(?:https?://)?(?:www\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/watch\?.+&v=))([\w-]{11})(?:.+)?$#x';
preg_match($pattern, $url, $matches);
return (isset($matches[1])) ? $matches[1] : false;
}
Pour expliquer la regex, voici une version développée:
/**
* Check if input string is a valid YouTube URL
* and try to extract the YouTube Video ID from it.
* @author Stephan Schmitz <[email protected]>
* @param $url string The string that shall be checked.
* @return mixed Returns YouTube Video ID, or (boolean) false.
*/
function parse_yturl($url)
{
$pattern = '#^(?:https?://)?'; # Optional URL scheme. Either http or https.
$pattern .= '(?:www\.)?'; # Optional www subdomain.
$pattern .= '(?:'; # Group Host alternatives:
$pattern .= 'youtu\.be/'; # Either youtu.be,
$pattern .= '|youtube\.com'; # or youtube.com
$pattern .= '(?:'; # Group path alternatives:
$pattern .= '/embed/'; # Either /embed/,
$pattern .= '|/v/'; # or /v/,
$pattern .= '|/watch\?v='; # or /watch?v=,
$pattern .= '|/watch\?.+&v='; # or /watch?other_param&v=
$pattern .= ')'; # End path alternatives.
$pattern .= ')'; # End Host alternatives.
$pattern .= '([\w-]{11})'; # 11 characters (Length of Youtube video ids).
$pattern .= '(?:.+)?$#x'; # Optional other ending URL parameters.
preg_match($pattern, $url, $matches);
return (isset($matches[1])) ? $matches[1] : false;
}
J'ai perfectionné la regex du leader answer . Il récupère également l'ID de toutes les différentes URL, mais plus correctement .
if (preg_match('%(?:youtube(?:-nocookie)?\.com/(?:[\w\-?&!#=,;]+/[\w\-?&!#=/,;]+/|(?:v|e(?:mbed)?)/|[\w\-?&!#=,;]*[?&]v=)|youtu\.be/)([\w-]{11})(?:[^\w-]|\Z)%i', $url, $match)) {
$video_id = $match[1];
}
En outre, il gère correctement les mauvais identifiants, qui comportent plus de 11 caractères.
http://www.youtube.com/watch?v=0zM3nApSvMgDw3qlxF
Utilisation
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
Je n'ai vu personne adresser directement l'erreur PHP, je vais donc tenter de vous expliquer.
La raison de l'erreur "Unknown modificateur '['" est que vous avez oublié de placer votre expression régulière dans des délimiteurs. PHP prend simplement le premier caractère comme séparateur, à condition qu'il s'agisse d'un caractère non alphanumérique, sans espace ASCII. Donc, dans votre regex:
preg_match("(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]/)[^&\n]+|(?<=v=)[^&\n]+", $subject, $matches);
PHP pense que vous vouliez dire (
en tant que délimiteur d'ouverture. Il trouve ensuite ce qu'il pense être votre délimiteur de fermeture, le prochain )
et suppose ce qui suit sont des modificateurs de modèle. Cependant, il trouve que votre premier modificateur de motif, le caractère suivant après le premier )
, est [
. [
n'est évidemment pas un modificateur de modèle valide, c'est pourquoi vous obtenez l'erreur que vous faites.
La solution consiste simplement à envelopper votre expression rationnelle dans des délimiteurs et à vous assurer que tous les délimiteurs de l'expression rationnelle que vous souhaitez faire correspondre à la lettre sont protégés. J'aime utiliser ~
comme délimiteurs, b/c vous avez rarement besoin de faire correspondre un ~
littéral dans une expression régulière.
Vous avez oublié d'échapper au caractère barre oblique. Donc, celui-ci devrait faire le travail:
preg_match("#(?<=v=)[a-zA-Z0-9-]+(?=&)|(?<=[0-9]\/)[^&\n]+|(?<=v=)[^&\n]+#", $subject, $matches);
Paramètre d'analyse Parse pour le BBcode ( https://developers.google.com/youtube/player_parameters#start )
exemple: [yt]http://www.youtube.com/watch?v=G059ou-7wmo#t=58[/yt]
PHP regex:
'#\[yt\]https?://(?:[0-9A-Z-]+\.)?(?:youtu\.be/|youtube\.com(?:/embed/|/v/|/watch\?v=|/ytscreeningroom\?v=|/feeds/api/videos/|/user\S*[^\w\-\s]|\S*[^\w\-\s]))([\w\-]{11})[?=#&+%\w-]*(t=(\d+))?\[/yt\]#Uim'
remplace:
'<iframe id="ytplayer" type="text/html" width="639" height="360" src="http://www.youtube.com/embed/$1?rel=0&vq=hd1080&start=$3" frameborder="0" allowfullscreen></iframe>'
utiliser ci-dessous le code
$url = "" // here is url of youtube video
$pattern = getPatternFromUrl($url); //this will retun video id
function getPatternFromUrl($url)
{
$url = $url.'&';
$pattern = '/v=(.+?)&+/';
preg_match($pattern, $url, $matches);
//echo $matches[1]; die;
return ($matches[1]);
}
cela a fonctionné pour moi.
$yout_url='http://www.youtube.com/watch?v=yxYjeNZvICk&blabla=blabla';
$videoid = preg_replace("#[&\?].+$#", "", preg_replace("#http://(?:www\.)?youtu\.?be(?:\.com)?/(embed/|watch\?v=|\?v=|v/|e/|.+/|watch.*v=|)#i", "", $yout_url));