Quelqu'un a-t-il une expression régulière qui obtient un lien vers une vidéo Youtube (objet non incorporé) de (presque) toutes les manières possibles de créer un lien vers Youtube?
Je pense que c'est un problème assez commun et je suis sûr qu'il y a beaucoup de façons de le lier.
Un point de départ serait:
Jusqu'ici, j'ai eu ce Regular expression
qui fonctionne pour les exemples que j'ai posté, et il obtient l'ID du premier groupe:
http(?:s?):\/\/(?:www\.)?youtu(?:be\.com\/watch\?v=|\.be\/)([\w\-\_]*)(&(amp;)?[\w\?=]*)?
J'ai amélioré les liens affichés ci-dessus avec un ami pour un script que j'ai écrit pour IRC afin de reconnaître même les liens sans http. Cela a fonctionné sur tous les tests de stress que j'ai obtenus jusqu'à présent, y compris le texte tronqué avec des URL youtube à peine reconnaissables, alors voici:
~(?:https?://)?(?:www\.)?youtu(?:be\.com/watch\?(?:.*?&(?:amp;)?)?v=|\.be/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?~
Je teste toutes les expressions rationnelles présentées ici et aucune ne peut couvrir tous les types d'URL utilisés par mon client.
J’ai construit cela à peu près par essais et erreurs, mais cela semble fonctionner avec tous les modèles publiés par Poppy Deejay.
"(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/)([a-zA-Z0-9_-]{11})+"
Peut-être que cela aide quelqu'un qui se trouve dans une situation similaire à celle que j'avais aujourd'hui;)
J'ai eu des problèmes récemment avec les URL atttribution_link donc j'ai essayé de créer ma propre regex qui fonctionne aussi pour ceux-là.
Voici ma chaîne de regex:
(https?://)?(www\\.)?(yotu\\.be/|youtube\\.com/)?((.+/)?(watch(\\?v=|.+&v=))?(v=)?)([\\w_-]{11})(&.+)?
et voici quelques cas de test que j'ai essayés:
http://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA
www.youtu.be/iwGFalTRHDA
youtu.be/iwGFalTRHDA
youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ
Rappelez-vous également de vérifier la chaîne que vous obtenez pour l'URL de votre vidéo. Parfois, il peut contenir le pourcentage de caractères. Si c'est le cas
url = [url stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
et ça devrait le réparer.
Rappelez-vous également que l’index de la clé youtube est maintenant l’index 9.
NSRange youtubeKey = [result rangeAtIndex:9]; //the youtube key
NSString * strKey = [url substringWithRange:youtubeKey] ;
Ce serait le plus long RegEx du monde si vous parveniez à couvrir tous les formats de lien, mais en voici un pour commencer qui couvre les deux premiers formats de lien:
http://(www\.)?youtube\.com/watch\?.*v=([a-zA-Z0-9]+).*
Le second groupe correspondra à l'ID de la vidéo si vous avez besoin de le sortir.
Piggy backing sur Fanmade , cela couvre les liens ci-dessous, y compris la version encodée en URL d’attribution_links:
(?:.+?)?(?:\/v\/|watch\/|\?v=|\&v=|youtu\.be\/|\/v=|^youtu\.be\/|watch\%3Fv\%3D)([a-zA-Z0-9_-]{11})+
https://www.youtube.com/attribution_link?a=tolCzpA7CrY&u=%2Fwatch%3Fv%3DMoBL33GT9S8%26feature%3Dshare
https://www.youtube.com/watch?v=MoBL33GT9S8&feature=share
http://www.youtube.com/watch?v=iwGFalTRHDA
https://www.youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA&feature=related
http://youtu.be/iwGFalTRHDA
http://www.youtube.com/embed/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/embed/watch?v=iwGFalTRHDA
http://www.youtube.com/embed/v=iwGFalTRHDA
http://www.youtube.com/watch?feature=player_embedded&v=iwGFalTRHDA
http://www.youtube.com/watch?v=iwGFalTRHDA
www.youtube.com/watch?v=iwGFalTRHDA
www.youtu.be/iwGFalTRHDA
youtu.be/iwGFalTRHDA
youtube.com/watch?v=iwGFalTRHDA
http://www.youtube.com/watch/iwGFalTRHDA
http://www.youtube.com/v/iwGFalTRHDA
http://www.youtube.com/v/i_GFalTRHDA
http://www.youtube.com/watch?v=i-GFalTRHDA&feature=related
http://www.youtube.com/attribution_link?u=/watch?v=aGmiw_rrNxk&feature=share&a=9QlmP1yvjcllp0h3l0NwuA
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&u=/watch?v=qYr8opTPSaQ&feature=em-uploademail
http://www.youtube.com/attribution_link?a=fF1CWYwxCQ4&feature=em-uploademail&u=/watch?v=qYr8opTPSaQ
Je travaille avec ce genre de liens:
http://www.youtube.com/v/M-faNJWWc9T0?fs=1&rel=0
Et voici le regEx que j'utilise pour obtenir un identifiant:
"(.+?)(\/v/)([a-zA-Z0-9_-]{11})+"
Cette expression rationnelle résoud mon problème, je peux obtenir un lien youtube avec un lien de surveillance, d'intégration ou partagé
(?:http(?:s)?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:(?:watch)?\?(?:.*&)?v(?:i)?=|(?:embed|v|vi|user)\/))([^\?&\"'<> #]+)
Vous pouvez vérifier ici https://regex101.com/r/Kvk0nB/1
Ceci itère sur les réponses existantes et gère mieux les cas Edge. (par exemple http://thisisnotyoutu.be/thing )
/(?:https?:\/\/|www\.|m\.|^)youtu(?:be\.com\/watch\?(?:.*?&(?:amp;)?)?v=|\.be\/)([\w\-]+)(?:&(?:amp;)?[\w\?=]*)?/
voici la solution complète pour obtenir la vidéo youtube id pour Java ou Android, je n’ai trouvé aucun lien qui ne fonctionne pas avec cette fonction
public static String getValidYoutubeVideoId(String youtubeUrl)
{
if(youtubeUrl == null || youtubeUrl.trim().contentEquals(""))
{
return "";
}
youtubeUrl = youtubeUrl.trim();
String validYoutubeVideoId = "";
String regexPattern = "^(?:https?:\\/\\/)?(?:[0-9A-Z-]+\\.)?(?:youtu\\.be\\/|youtube\\.com\\S*[^\\w\\-\\s])([\\w\\-]{11})(?=[^\\w\\-]|$)(?![?=&+%\\w]*(?:['\"][^<>]*>|<\\/a>))[?=&+%\\w]*";
Pattern regexCompiled = Pattern.compile(regexPattern, Pattern.CASE_INSENSITIVE);
Matcher regexMatcher = regexCompiled.matcher(youtubeUrl);
if(regexMatcher.find())
{
try
{
validYoutubeVideoId = regexMatcher.group(1);
}
catch(Exception ex)
{
}
}
return validYoutubeVideoId;
}