So che c’è un sacco di domande a cui rispondere qui https://stackoverflow.com/questions/tagged/youtube+regex , ma non in grado di trovare una domanda simile a me.
Qualsiasi corpo ha l’espressione regolare JavaScript per convalidare la riga dell’URL VIDEO YouTube sotto elencata. Voglio solo sapere dove un tale URL può essere ansible
http://www.youtube.com/watch?v=bQVoAWSP7k4 http://www.youtube.com/watch?v=bQVoAWSP7k4&feature=popular http://www.youtube.com/watch?v=McNqjYiFmyQ&feature=related&bhablah http://youtube.com/watch?v=bQVoAWSP7k4
– aggiornamento 1– – aggiornamento 2–
Questo ha funzionato quasi bene, ma non è riuscito per l’URL http://youtube.com/watch?v=bQVoAWSP7k4
var matches = $('#videoUrl').val().match(/http:\/\/(?:www\.)?youtube.*watch\?v=([a-zA-Z0-9\-_]+)/); if (matches) { alert('valid'); } else { alert('Invalid'); }
^http:\/\/(?:www\.)?youtube.com\/watch\?v=\w+(&\S*)?$ //if v can be anywhere in the query list ^http:\/\/(?:www\.)?youtube.com\/watch\?(?=.*v=\w+)(?:\S+)?$
Poiché la spiegazione si allunga sempre più, posiziono il risultato finale in cima. Sentiti libero di copiare + incollare e andare per la tua strada. Per una spiegazione dettagliata, leggi “la storia completa” di seguito.
/** * JavaScript function to match (and return) the video Id * of any valid Youtube Url, given as input string. * @author: Stephan Schmitz * @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; }
La regex di Amarghosh sembra buona, a prima vista. Ma ciò:
v=aa
e v=aaaaaaaaaaaaaaaaaa
ritorno ad essere valido), Per abbinare https, il carattere di trattino e per convalidare la lunghezza dell’ID, questo era il mio suggerimento iniziale di una versione modificata della regex di Amarghosh:
^https?:\/\/(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$
Dopo aver postato il pattern sopra, mi è stato chiesto: “Che cosa succede se l’ URL è come questo;
youtube.com/watch?gl=US&hl=en-US&v=bQVoAWSP7k4
“ ?
Prima di tutto, si prega di notare che questo non è un URL . Gli URL conformi a RFC devono iniziare con lo schema! 😉
In ogni caso, per abbinare qualsiasi tipo di stringa che indica di fare riferimento a un video di YouTube, ho aggiornato la mia risposta per escludere lo schema URL richiesto. Quindi il mio secondo suggerimento era il seguente:
^(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$
Poi mi è stato chiesto di aggiungere il supporto per un “caso speciale”; i tuoi url brevi. Inizialmente non li ho aggiunti, poiché non faceva specificamente parte della domanda. Tuttavia ho aggiornato la mia risposta ora con tutti i possibili “casi speciali” . Ciò significa che non solo ho aggiunto il supporto per i collegamenti youtu.be, ma anche i percorsi di richiesta “/ v” e “/ embed”.
Quindi, posso introdurre: La mia ultima ed ultima regex di Youtube:
^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$
Ora questo modello funzionerà per qualsiasi stringa, formattato come segue:
Senza schema e sottodominio (Dominio: youtu.be, Percorso: /)
youtu.be/
Senza schema, con sottodominio (Dominio: youtu.be, Percorso: /)
www.youtu.be/
Con schema HTTP, senza sottodominio (Dominio: youtu.be, Percorso: /)
http://youtu.be/
Con schema HTTP e sottodominio (Dominio: youtu.be, Percorso: /)
http://www.youtu.be/
Con schema HTTPS, senza sottodominio (Dominio: youtu.be, Percorso: /)
https://youtu.be/
Con schema HTTPS e sottodominio (Dominio: youtu.be, Percorso: /)
https://www.youtu.be/
Senza schema e sottodominio (Dominio: youtube.com, Percorso: / embed)
youtube.com/embed/ youtube.com/embed/ &other_params
Senza schema, con sottodominio (Dominio: youtube.com, Percorso: / embed)
www.youtube.com/embed/ www.youtube.com/embed/ &other_params
Con schema HTTP, senza sottodominio (Dominio: youtube.com, Percorso: / embed)
http://youtube.com/embed/ http://youtube.com/embed/ &other_params
Con schema HTTP e sottodominio (Dominio: youtube.com, Percorso: / embed)
http://www.youtube.com/embed/ http://www.youtube.com/embed/ &other_params
Con schema HTTPS, senza sottodominio (Dominio: youtube.com, Percorso: / embed)
https://youtube.com/embed/ https://youtube.com/embed/ &other_params
Con schema HTTPS e sottodominio (Dominio: youtube.com, Percorso: / embed)
https://www.youtube.com/embed/ https://www.youtube.com/embed/ &other_params
Senza schema e sottodominio (Dominio: youtube.com, Percorso: / v)
youtube.com/v/ youtube.com/v/ &other_params
Senza schema, con sottodominio (Dominio: youtube.com, Percorso: / v)
www.youtube.com/v/ www.youtube.com/v/ &other_params
Con schema HTTP, senza sottodominio (Dominio: youtube.com, Percorso: / v)
http://youtube.com/v/ http://youtube.com/v/ &other_params
Con schema HTTP e sottodominio (Dominio: youtube.com, Percorso: / v)
http://www.youtube.com/v/ http://www.youtube.com/v/ &other_params
Con schema HTTPS, senza sottodominio (Dominio: youtube.com, Percorso: / v)
https://youtube.com/v/ https://youtube.com/v/ &other_params
Con schema HTTPS e sottodominio (Dominio: youtube.com, Percorso: / v)
https://www.youtube.com/v/ https://www.youtube.com/v/ &other_params
Senza schema e sottodominio (Dominio: youtube.com, Percorso: / guarda)
youtube.com/watch?v= youtube.com/watch?v= &other_params youtube.com/watch?other_params&v= youtube.com/watch?other_params&v= &more_params
Senza schema, con sottodominio (Dominio: youtube.com, Percorso: / guarda)
www.youtube.com/watch?v= www.youtube.com/watch?v= &other_params www.youtube.com/watch?other_params&v= www.youtube.com/watch?other_params&v= &more_params
Con schema HTTP, senza sottodominio (Dominio: youtube.com, Percorso: / guarda)
http://youtube.com/watch?v= http://youtube.com/watch?v= &other_params http://youtube.com/watch?other_params&v= http://youtube.com/watch?other_params&v= &more_params
Con schema HTTP e sottodominio (Dominio: youtube.com, Percorso: / guarda)
http://www.youtube.com/watch?v= http://www.youtube.com/watch?v= &other_params http://www.youtube.com/watch?other_params&v= http://www.youtube.com/watch?other_params&v= &more_params
Con schema HTTPS, senza sottodominio (Dominio: youtube.com, Percorso: / guarda)
https://youtube.com/watch?v= https://youtube.com/watch?v= &other_params https://youtube.com/watch?other_params&v= https://youtube.com/watch?other_params&v= &more_params
Con schema HTTPS e sottodominio (Dominio: youtube.com, Percorso: / guarda)
https://www.youtube.com/watch?v= https://www.youtube.com/watch?v= &other_params https://www.youtube.com/watch?other_params&v= https://www.youtube.com/watch?other_params&v= &more_params
Il modo più semplice per usare il pattern è quello di avvolgerlo in una funzione come questa:
/** * JavaScript function to match (and return) the video Id * of any valid Youtube Url, given as input string. * @author: Stephan Schmitz * @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 + "\r\nResult: " + (!ytId ? 'false' : ytId)); } }, false);
Non è ansible abbinare la parte id con \ w +, in quanto non include il carattere trattino (-). [a-zA-Z0-9 _-] + sarebbe qualcosa di più corretto.
@eyecatchup ubove ha una regex eccellente, ma con l’aiuto di regexper.com ho visto che la sua espressione regolare passerà qualsiasi URL di youtube in cui il parametro? v ha un valore di qualsiasi parola o – segno ripetuto 11 volte. Ma YouTube limita in modo specifico l’ID del video a 11 caratteri, quindi una correzione per la sua regex sarebbe
/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((.|-){11})(?:\S+)?$/
confrontare la visibilità della sua 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?$/
e la mia correzione
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
come modifica al limite di 11 caratteri che cambia in futuro, quindi la regex corrente significherebbe che qualsiasi parola o – dovrebbe essere ripetuta esattamente 11 volte, a quello che la mia correzione è
/^(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11,})(?:\S+)?$/
Miglioramento per la grande regex di @ eyecatchUp:
^(?:https?:\/\/)?(?:(?:www|m)\.)?(?:youtu\.be\/|youtube(?:-nocookie)?\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((\w|-){11})(?:\S+)?$
Regexper:
http://regexper.com/#%5E(%3F%3Ahttps%3F%3A%5C%2F%5C%2F)%3F(%3F%3A(%3F%3Awww%7Cm)%5C.)%3F(%3F%3Ayoutu%5C.be%5C%2F%7Cyoutube(%3F%3A-nocookie)%3F%5C.com%5C%2F(%3F%3Aembed%5C%2F%7Cv%5C%2F%7Cwatch%5C%3Fv%3D%7Cwatch%5C%3F.%2B%26v%3D))((%5Cw%7C-)%7B11%7D)(%3F%3A%5CS%2B)%3F%24
function get_youtube_video_id_from_url(url){ var code = url.match(/v=([^]{5,})/) return (typeof code[1] == 'string') ? code[1] : false; }
function validYT(url) { var p = /^(?:https?:\/\/)?(?:www\.)?youtube\.com\/watch\?(?=.*v=((\w|-){11}))(?:\S+)?$/; return (url.match(p)) ? RegExp.$1 : false; }