C # regex per ottenere l’id del video da youtube e vimeo dall’URL

Sono impegnato a provare a creare due espressioni regolari per filtrare l’id dai video di youtube e vimeo. Ho già le seguenti espressioni;

YouTube: (youtube\.com/)(.*)v=([a-zA-Z0-9-_]+) Vimeo: vimeo\.com/([0-9]+)$ 

Come ho spiegato di seguito, ci sono 2 tipi di URL corretti dalle espressioni regolari che ho già creato. Diversi altri tipi di URL di Vimeo e YouTube non sono coperti dalle espressioni. Quello che preferisco di più è che tutto questo può essere coperto in due espressioni. Uno per tutti i video di Vimeo e uno per tutti i video di youtube. Sono stato impegnato a sperimentare alcune espressioni diverse, ma finora non ho avuto successo. Sto ancora cercando di dominare le espressioni regolari, quindi spero di essere sulla strada giusta e qualcuno mi può aiutare! Se sono necessarie ulteriori informazioni, per favore fatemelo sapere!

URL VIMEO NON ABBINATI:

 http://vimeo.com/channels/hd#11384488 http://vimeo.com/groups/brooklynbands/videos/7906210 http://vimeo.com/staffpicks#13561592 

URL YOUTUBE NON CORRISPONDENTI

 http://www.youtube.com/user/username#p/a/u/1/bpJQZm_hkTE http://www.youtube.com/v/bpJQZm_hkTE http://youtu.be/bpJQZm_hkTE 

URL corrispondenti

 http://www.youtube.com/watch?v=bWTyFIYPtYU&feature=popular http://vimeo.com/834881 

L’idea è quella di abbinare tutti gli URL sopra menzionati con due espressioni regolari. Uno per vimeo e uno per youtube.

AGGIORNAMENTO DOPO LA RISPOSTA Sedith:

Ecco come stanno le mie espressioni ora

 public static readonly Regex VimeoVideoRegex = new Regex(@"vimeo\.com/(?:.*#|.*/videos/)?([0-9]+)", RegexOptions.IgnoreCase | RegexOptions.Multiline); public static readonly Regex YoutubeVideoRegex = new Regex(@"youtu(?:\.be|be\.com)/(?:(.*)v(/|=)|(.*/)?)([a-zA-Z0-9-_]+)", RegexOptions.IgnoreCase); 

E nel codice che ho

 var youtubeMatch = url.match(YoutubeVideoRegex ); var vimeoMatch = url.match(VimeoVideoRegex ); var youtubeIndex = (youtubeMatch.length - 1) var youtubeId = youtubeMatch[youtubeIndex]; 

Come puoi vedere ora ho bisogno di trovare l’indice in cui il videoId si trova nell’array con le corrispondenze restituite dalla regex. Ma voglio solo restituire l’id stesso, quindi non ho bisogno di modificare il codice quando youtube di vimeo deciderà mai di cambiare gli URL. Qualche consiglio su questo?

Ho avuto un gioco con gli esempi e ho trovato questo:

 Youtube: youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+) Vimeo: vimeo\.com/(?:.*#|.*/videos/)?([0-9]+) 

E dovrebbero corrispondere a tutti quelli dati. Il (?: …) significa che tutto ciò che si trova all’interno della parentesi non verrà catturato. Quindi dovrebbe essere ottenuto solo l’id.

Sono un po ‘un novizio di regex anch’io, quindi non sorprenderti se qualcun altro entra qui urlando di non ascoltarmi, ma spero che questi siano d’aiuto.

Trovo questo sito estremamente utile per elaborare i modelli: http://www.regexpal.com/

Modificare:

ottieni l’id in questo modo:

 string url = ""; //url goes here! Match youtubeMatch = YoutubeVideoRegex.Match(url); Match vimeoMatch = VimeoVideoRegex.Match(url); string id = string.Empty; if (youtubeMatch.Success) id = youtubeMatch.Groups[1].Value; if (vimeoMatch.Success) id = vimeoMatch.Groups[1].Value; 

Funziona con il semplice vecchio c # .net, non può garantire per asp.net

Nel caso in cui si stia scrivendo qualche applicazione con view model (es. ASP.NET MVC):

 public string YouTubeUrl { get; set; } public string YouTubeVideoId { get { var youtubeMatch = new Regex(@"youtu(?:\.be|be\.com)/(?:.*v(?:/|=)|(?:.*/)?)([a-zA-Z0-9-_]+)") .Match(this.YouTubeUrl); return youtubeMatch.Success ? youtubeMatch.Groups[1].Value : string.Empty; } } 

Vimeo:

 vimeo\.com/(?:.*#|.*/)?([0-9]+)