L'amélioration de la regex pour l'analyse de YouTube / Vimeo Url
J'ai fait une fonction (en JavaScript) qui prend une URL à partir soit sur YouTube ou Vimeo. Il en déduit le fournisseur et l'ID de cette vidéo (démo: http://jsfiddle.net/csjwf/).
function parseVideoURL(url) {
var provider = url.match(/http:\/\/(:?www.)?(\w*)/)[2],
id;
if(provider == "youtube") {
id = url.match(/http:\/\/(?:www.)?(\w*).com\/.*v=(\w*)/)[2];
} else if (provider == "vimeo") {
id = url.match(/http:\/\/(?:www.)?(\w*).com\/(\d*)/)[2];
} else {
throw new Error("parseVideoURL() takes a YouTube or Vimeo URL");
}
return {
provider : provider,
id : id
}
}
Cela fonctionne, cependant, comme une regex Novice, je suis à la recherche de moyens de l'améliorer. L'entrée, je fais face à, ressemble généralement à ceci:
http://vimeo.com/(id)
http://youtube.com/watch?v=(id)&blahblahblah.....
1) Droit maintenant, je suis en train de faire trois matches différents, ne serait-il judicieux d'essayer de la faire tout en une seule expression? Si oui, comment?
2) les correspondances existantes à être plus concis? Sont-ils inutilement complexe? ou peut-être insuffisant?
3) existe-il des YouTube ou Vimeo URL qui serait manquer d'être analysée? J'ai essayé un peu et pour l'instant il semble fonctionner assez bien.
Pour résumer: je suis simplement à la recherche de moyens d'améliorer la fonction ci-dessus. Tout conseil est le bienvenu.
OriginalL'auteur Daniel | 2011-04-10
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr au sujet de votre question 3), mais à condition que votre induction sur l'url formes sont correctes, les regexes peuvent être combinés en un seul, comme suit:
Vous obtiendrez le match sous différentes positions (1er et 2ème matchs si vimeo, 3ème et 4ème matchs de si youtube), donc vous avez juste besoin de gérer cela.
Ou, si vous êtes tout à fait sûr que vimeo id uniquement des chiffres, alors vous pouvez faire:
et le fournisseur et le code d'identification de la apprear en vertu de la 1ère et de la 2ème match, respcetively.
OriginalL'auteur sawa
Voici ma tentative à l'expression régulière, qui couvre la plupart des mises à jour de cas:
Merci pour la suggestion, l'ont intégré.
OriginalL'auteur Yangshun Tay
Regex est merveilleusement laconique, mais peut rapidement devenir compliqué.
http://jsfiddle.net/8nagx2sk/
Parfois simple code est plus agréable à vos collègues développeurs.
https://jsfiddle.net/1dzb5ag1/
Qui préférez-vous mettre à jour?
OriginalL'auteur Jason Sebring
Voici ma regex
http://jsfiddle.net/csjwf/1/
Object {provider: "youtube", id: "My2FRPA3Gf"}
. Avis le 8 manquants dans l'id.OriginalL'auteur Ming-Tang
sur sawa réponse :
une petite mise à jour sur la deuxième regex :
(s'échapper les points empêche l'url correspondante de type www_vimeo_com/... et $ ajoutée...)
ici est la même idée pour la mise en correspondance de l'intégration url :
/^http:\/\/youtu\.be\/(.+?)(?:|$|\?)/
cette expression n'est pas assez bon, il correspond à
http://player.youtube.com/sdfsdfdf
qui n'est pas valide url youtubeOriginalL'auteur Romain
Pour Vimeo, Ne pas compter sur Regex comme Vimeo tend à changer/mettre à jour leur modèle d'URL de chaque maintenant et puis. Comme de 2 octobre, en 2017, il y a au total six schémas d'URL Vimeo prend en charge.
Au lieu de cela, l'utilisation de leur API pour valider vimeo Url. Voici ce oembed, il (doc) de l'API qui prend une URL, vérifie sa validité et de retourner un objet avec des tas d'informations vidéo(consultez le dev de la page). Bien que n'étant pas prévu mais on peut facilement l'utiliser pour valider si une URL est de Vimeo ou pas.
Donc, avec l'ajax, il devrait ressembler à cela,
OriginalL'auteur fluffyBatman
3) Votre regex ne correspond pas à l'url https. Je n'ai pas testé, mais je suppose que la "http://" serait devenu "http(s)?://". Notez que ce serait changer les positions correspondantes du fournisseur et id.
OriginalL'auteur vrijdenker
Juste au cas où voici une version de php
OriginalL'auteur mica