2010-09-06 10 views
24

Ich bin damit beschäftigt, zwei reguläre Ausdrücke zu erstellen, um die ID von Youtube- und Vimeo-Videos zu filtern. Ich habe bereits die folgenden Ausdrücke;C# regex, um die Video-ID von youtube und vimeo per URL zu erhalten

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

Wie ich unten erläutert habe, gibt es zwei Arten von URLs, die mit den regulären Ausdrücken übereinstimmen, die ich bereits erstellt habe. Einige andere Arten von URLs von Vimeo und YouTube sind nicht durch die Ausdrücke abgedeckt. Was ich am meisten bevorzuge ist, dass all dies in zwei Ausdrücken abgedeckt werden kann. Eine für alle Vimeo-Videos und eine für alle Youtube-Videos. Ich habe mit verschiedenen Ausdrücken experimentiert, aber bisher keinen Erfolg. Ich versuche immer noch, reguläre Ausdrücke zu beherrschen, also hoffe ich, dass ich auf dem richtigen Weg bin und jemand mir helfen kann! Wenn mehr Informationen benötigt werden, lass es mich wissen!

VIMEO URLs NOT MATCHED:

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

YOUTUBE URLs ABGESTIMMTER NICHT

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

URLs Matched

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

Die Idee passen die alle URLs oben mit zwei regulären Ausdrücken erwähnt ist . Eins für Vimeo und eins für Youtube.

UPDATE NACH ANTWORT Sedith:

Dies ist, wie meine Ausdrücke aussieht jetzt

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); 

Und ich in Code habe

var youtubeMatch = url.match(YoutubeVideoRegex); 
var vimeoMatch = url.match(VimeoVideoRegex); 

var youtubeIndex = (youtubeMatch.length - 1) 
var youtubeId = youtubeMatch[youtubeIndex]; 

Wie Sie mich jetzt den Index finden müssen sehen können Die videoId befindet sich im Array mit Übereinstimmungen, die von der Regex zurückgegeben werden. Aber ich möchte, dass es nur die IDs selbst zurückgibt, also muss ich den Code nicht ändern, wenn Youtube von Vimeo jemals entscheidet, dort urls zu ändern. Irgendwelche Tipps dazu?

Antwort

58

hatte ich ein Spiel mit den Beispielen um und kam mit dieser bis:

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

Und sie sollten alle angegebenen übereinstimmen. Das (?: ...) bedeutet, dass alles in der Klammer nicht erfasst wird. Also sollte nur die ID erhalten werden.

Ich selbst bin ein bisschen ein Regex-Neuling, also wundere dich nicht, wenn jemand anderes hierher kommt und schreit, um nicht auf mich zu hören, aber hoffentlich werden diese helfen.

Ich finde diese Website sehr nützlich in das Muster Ausarbeiten: http://www.regexpal.com/

Edit:

die ID erhält wie folgt:

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; 

, die in plain old C# .net funktioniert, kann Ich verbürge mich für Asp.net

+0

Dank! Ich habe die Ausdrücke und die Arbeit perfekt ausprobiert, aber während ich getestet habe, habe ich herausgefunden, dass es bequemer ist, nur den Teil der URL zu bekommen, der die Video-ID enthält, ist das möglich? – Rob

+2

Siehe oben Änderungen. Das Youtube-Muster war ein wenig falsch, aber jetzt sollten beide die ID in Übereinstimmung haben. Gruppen [1]. Wert – Septih

+0

Danke für die gute Antwort! Ich werde das als erstes ausprobieren und werde es euch wissen lassen! – Rob

0

Vimeo:

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

Falls Sie eine Anwendung mit Blick Modell schreiben (zum Beispiel 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; 
    } 
} 
Verwandte Themen