ULTIMATIVE YOUTUBE REGEX
Rosinenpickerei
Da die Erklärung immer länger wird, setze ich das Endergebnis ganz oben. Fühlen Sie sich frei, zu kopieren + einzufügen, und machen Sie sich auf den Weg. Für eine detaillierte Erklärung lesen Sie unten _”die ganze Geschichte”_.
/**
* JavaScript function to match (and return) the video Id
* of any valid Youtube Url, given as input string.
* @author: Stephan Schmitz <[email protected]>
* @url: https://stackoverflow.com/a/10315969/624466
*/
function ytVidId(url) {
var p = /^(?:https?://)?(?:www.)?(?:youtu.be/|youtube.com/(?:embed/|v/|watch?v=|watch?.+&v=))((w|-){11})(?:S+)?$/;
return (url.match(p)) ? RegExp.$1 : false;
}
Die ganze Geschichte
Die Regex von Amarghosh sieht auf den ersten Blick gut aus. Aber es:
- stimmt nicht mit Video-IDs überein, die Bindestriche (-) enthalten,
- validiert nicht die ID-Länge (
v=aa
und v=aaaaaaaaaaaaaaaaaa
zurück, um gültig zu sein),
- und stimmt überhaupt nicht mit gesicherten URLs überein (httpS://youtube.com/watch?valid_params)
Um https, den Bindestrich, abzugleichen und die ID-Länge zu validieren, war dies mein erster Vorschlag einer modifizierten Version von Amarghoshs Regex:
^https?://(?:www.)?youtube.com/watch?(?=.*v=((w|-){11}))(?:S+)?$
UPDATE 1: URLs versus Strings
Nachdem ich das obige Muster gepostet hatte, wurde ich gefragt: „Was ist, wenn die URL ich mag das;
youtube.com/watch?gl=US&hl=en-US&v=bQVoAWSP7k4
“?
Bitte beachten Sie zunächst, dass dies nicht a URL überhaupt. RFC-konforme URLs muss mit dem Schema beginnen! 😉
Wie auch immer, passend zu jeder Art von Schnur die auf ein YouTube-Video verweist, habe ich meine Antwort aktualisiert, um das erforderliche URL-Schema auszuschließen. Also mein zweiter Vorschlag war folgender:
^(?:https?://)?(?:www.)?youtube.com/watch?(?=.*v=((w|-){11}))(?:S+)?$
UPDATE 2: Die ultimative Regex
Dann wurde ich gebeten, Unterstützung für einen “Sonderfall” hinzuzufügen; das Youtube kurze URLs. Anfangs habe ich diese nicht hinzugefügt, da es nicht speziell Teil der Frage war. Allerdings habe ich meine Antwort jetzt mit aktualisiert alle möglich “Sonderfälle”. Das bedeutet, dass ich nicht nur die Unterstützung für youtu.be-Links hinzugefügt habe, sondern auch die Anforderungspfade “/v” und “/embed”.
Darf ich vorstellen: Meine letzte und ultimative Youtube-Regex:
^(?:https?://)?(?:www.)?(?:youtu.be/|youtube.com/(?:embed/|v/|watch?v=|watch?.+&v=))((w|-){11})(?:S+)?$
Welche Zeichenfolgen werden abgeglichen?
Jetzt funktioniert dieses Muster für alle Zeichenfolgen, die wie folgt formatiert sind:
Ohne Schema und Subdomain (Domain: youtu.be, Pfad: /)
youtu.be/<video:id>
Ohne Schema, mit Subdomain (Domain: youtu.be, Pfad: /)
www.youtu.be/<video:id>
Mit HTTP-Schema, ohne Subdomain (Domain: youtu.be, Pfad: /)
http://youtu.be/<video:id>
Mit HTTP-Schema und Subdomain (Domain: youtu.be, Pfad: /)
http://www.youtu.be/<video:id>
Mit HTTPS-Schema, ohne Subdomain (Domain: youtu.be, Pfad: /)
https://youtu.be/<video:id>
Mit HTTPS-Schema und Subdomain (Domain: youtu.be, Pfad: /)
https://www.youtu.be/<video:id>
Ohne Schema und Subdomain (Domain: youtube.com, Pfad: /embed)
youtube.com/embed/<video:id>
youtube.com/embed/<video:id>&other_params
Ohne Schema, mit Subdomain (Domain: youtube.com, Pfad: /embed)
www.youtube.com/embed/<video:id>
www.youtube.com/embed/<video:id>&other_params
Mit HTTP-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /embed)
http://youtube.com/embed/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTP-Schema und Subdomain (Domain: youtube.com, Pfad: /embed)
http://www.youtube.com/embed/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTPS-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /embed)
https://youtube.com/embed/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTPS-Schema und Subdomain (Domain: youtube.com, Pfad: /embed)
https://www.youtube.com/embed/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Ohne Schema und Subdomain (Domain: youtube.com, Pfad: /v)
youtube.com/v/<video:id>
youtube.com/v/<video:id>&other_params
Ohne Schema, mit Subdomain (Domain: youtube.com, Pfad: /v)
www.youtube.com/v/<video:id>
www.youtube.com/v/<video:id>&other_params
Mit HTTP-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /v)
http://youtube.com/v/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTP-Schema und Subdomain (Domain: youtube.com, Pfad: /v)
http://www.youtube.com/v/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTPS-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /v)
https://youtube.com/v/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Mit HTTPS-Schema und Subdomain (Domain: youtube.com, Pfad: /v)
https://www.youtube.com/v/<video:id>
https://youtube.com/watch?v=%26lt%3Bvideo%3Aid%26gt%3B%26other_params
Ohne Schema und Subdomain (Domain: youtube.com, Pfad: /watch)
youtube.com/watch?v=<video:id>
youtube.com/watch?v=<video:id>&other_params
youtube.com/watch?other_params&v=<video:id>
youtube.com/watch?other_params&v=<video:id>&more_params
Ohne Schema, mit Subdomain (Domain: youtube.com, Pfad: /watch)
www.youtube.com/watch?v=<video:id>
www.youtube.com/watch?v=<video:id>&other_params
www.youtube.com/watch?other_params&v=<video:id>
www.youtube.com/watch?other_params&v=<video:id>&more_params
Mit HTTP-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /watch)
http://youtube.com/watch?v=<video:id>
http://youtube.com/watch?v=<video:id>&other_params
http://youtube.com/watch?other_params&v=<video:id>
http://youtube.com/watch?other_params&v=<video:id>&more_params
Mit HTTP-Schema und Subdomain (Domain: youtube.com, Pfad: /watch)
http://www.youtube.com/watch?v=<video:id>
http://www.youtube.com/watch?v=<video:id>&other_params
http://www.youtube.com/watch?other_params&v=<video:id>
http://www.youtube.com/watch?other_params&v=<video:id>&more_params
Mit HTTPS-Schema, ohne Subdomain (Domain: youtube.com, Pfad: /watch)
https://youtube.com/watch?v=<video:id>
https://youtube.com/watch?v=<video:id>&other_params
https://youtube.com/watch?other_params&v=<video:id>
https://youtube.com/watch?other_params&v=<video:id>&more_params
Mit HTTPS-Schema und Subdomain (Domain: youtube.com, Pfad: /watch)
https://www.youtube.com/watch?v=<video:id>
https://www.youtube.com/watch?v=<video:id>&other_params
https://www.youtube.com/watch?other_params&v=<video:id>
https://www.youtube.com/watch?other_params&v=<video:id>&more_params
FUNKTIONELLE VERWENDUNG
Der einfachste Weg, das Muster zu verwenden, besteht darin, es in eine Funktion wie diese zu packen:
/**
* JavaScript function to match (and return) the video Id
* of any valid Youtube Url, given as input string.
* @author: Stephan Schmitz <[email protected]>
* @url: https://stackoverflow.com/a/10315969/624466
*/
function ytVidId(url) {
var p = /^(?:https?://)?(?:www.)?(?:youtu.be/|youtube.com/(?:embed/|v/|watch?v=|watch?.+&v=))((w|-){11})(?:S+)?$/;
return (url.match(p)) ? RegExp.$1 : false;
}
// for example snippet only!
document.body.addEventListener('click', function(e) {
if (e.target.className == 'yt-url' && 'undefined' !== e.target.value) {
var ytId = ytVidId(e.target.value);
alert(e.target.value + "rnResult: " + (!ytId ? 'false' : ytId));
}
}, false);
<!-- Click the buttons to probe URLs -->
<input type="button" value="https://www.youtube.com/watch?v=p-e2G_VcTms&feature=g-logo&context=G29aead6FOAAAAAAABAA" class="yt-url">
<input type="button" value="https://www.youtube.com/latest" class="yt-url">
Wenn der Ergebniswert der Funktion ein boolescher Wert sein muss, ersetzen Sie einfach RegExp.$1
durch true
. Das ist es.
Eine letzte Anmerkung zur Länge der Video-ID: Es wurde gefragt, ob die IDs eine feste Länge von 11 Zeichen haben? und wenn es sich in Zukunft ändern könnte?
Die beste Antwort auf diese Frage ist wahrscheinlich auch die einzige “offizielle” Aussage, die ich gefunden habe Hier und die sagt: “Ich sehe nirgendwo in der Dokumentation, wo wir uns offiziell zu einer Standardlänge von 11 Zeichen für YouTube-Video-IDs verpflichten. Es ist eines dieser Dinge, bei denen wir eine aktuelle Implementierung haben, und das kann auf unbestimmte Zeit so bleiben. Aber wir sind keine offizielle Verpflichtung dazu geben, also auf eigene Gefahr vorgehen.”
@eyecatchup ubove hat eine ausgezeichnete Regex, aber mit Hilfe von regexper.com habe ich gesehen, dass seine Regex jede YouTube-URL weitergibt, bei der der Parameter ?v einen Wert eines Wortes oder Zeichens hat, das 11 Mal wiederholt wird. Aber YouTube beschränkt die Video-ID speziell auf 11 Zeichen, so dass eine Korrektur für seine Regex wäre
/^(?:https?://)?(?:www.)?(?:youtu.be/|youtube.com/(?:embed/|v/|watch?v=|watch?.+&v=))((.|-){11})(?:S+)?$/
vergleiche die Visualisierung seiner Regex
http://www.regexper.com/#/%5E%28?:https?:%5C/%5C/%29?%28?:www%5C.%29?%28?:youtu%5C.be%5C/%7Cyoutube%5C.com%5C/%28?:embed%5C/%7Cv%5C/%7Cwatch%5C?v=%7Cwatch%5C?.%2b&v=%29%29%28%28%5Cw%7C-%29%7B11%7D%29%28?:%5CS%2b%29?$/
und mein Fix
http://www.regexper.com/#%2F%5E(%3F%3Ahttps%3F%3A%5C%2F%5C%2F)%3F(%3F%3Awww%5C.)%3F(%3F%3Ayoutu%5C.be%5C%2F%7Cyoutube%5C.com%5C%2F(%3F%3Aembed%5C%2F%7Cv%5C%2F%7Cwatch%5C%3Fv%3D%7Cwatch%5C%3F.%2B%26v%3D))((%5Ba-zA-Z0-9%5D%7C-)%7B11%7D)(%3F%3A%5CS%2B)%3F%24%2F
als Änderung der 11-Zeichen-Grenze, die sich in Zukunft ändert, würde die aktuelle Regex bedeuten, dass jedes Wort oder – genau 11-mal wiederholt werden müsste, dazu ist mein Fix
/^(?:https?://)?(?:www.)?(?:youtu.be/|youtube.com/(?:embed/|v/|watch?v=|watch?.+&v=))((w|-){11,})(?:S+)?$/
.
Diese Regex, die Sie dort haben, ist sehr lästig. Besonders die
.*
Teil, der zu allem passt. Dies bedeutet, dass es auch mit der folgenden URL übereinstimmen würde:http://hackersrus.com/youtube-watch?v=a
– Sinnvoll
3. Juni ’10 um 9:51
Hoppla! geändert in var-Übereinstimmungen = $(‘#videoUrl’).val().match(/http://(?:www.)?youtube.*watch?v=([a-zA-Z0-9-_]+)/); if (passt) { alert(‘gültig’); } else { alert(‘Ungültig’); }
– Mithun Sreedharan
3. Juni ’10 um 10:04
Immer noch falsch, siehe meine Antwort für einen vollständig richtigen Weg.
– Blickfang
9. Mai ’12 um 10:27