2017-03-06 37 views
-1

我试图从正则表达式输入youtube url来获取视频ID。无效的正则表达式 - 无法重复 - Javascript

下面是正则表达式我使用:

/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/ 

但它是回来为

Uncaught SyntaxError: Invalid regular expression: //^.*(youtu.be/|v/|u/w/|embed/|watch?v=|&v=|?v=)([^#&?]*).*// : Nothing to repeat

为什么?

下面是我的代码:

function PreviewVideo() { 
var self = this; 
this.links = $(".videoPreview"); 

this.bindEvents = function() { 
    self.links.on("click", self.fireModal); 
}; 
this.getYoutubeId = function (url) { 

    var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^#\&\?]*).*/; 
    var match = url.match(regExp); 
    if (match && match[2].length == 11) { 
     return match[2]; 
    } else { 
     return false; 
    } 
}; 
this.fireModal = function (e) { 
    e.preventDefault; 
    var $this = $(this); 
    var videoField = $this.data("video"); 
    var videoURL = $(videoField).val(); 

    if (videoURL === "") { 
     $("body").append(UI.toast({level: "danger", time: 5000, html: "<h4>No video URL found</h4>", dismissable: true, position: "top-right"})); 
    } else { 
     var videoID = self.getYoutubeId(videoURL); 
     if (videoID) { 
      UI.modal({title: "Video preview", body: '<iframe width="560" height="315" src="//www.youtube.com/embed/' + videoID + '" frameborder="0" allowfullscreen></iframe>'}) 
     } else { 
      $("body").append(UI.toast({level: "danger", time: 5000, html: "<h4>Invalid URL</h4>", dismissable: true, position: "top-right"})); 
     } 
    } 
}; 

this.bindEvents(); 

}

+0

的'/'youtube.be'被认为是正则表达式结束后'。你必须逃避它。 –

+0

@FabianKlötzl:它被逃脱了,代码没有正确标记。 –

+0

可能重复[Javascript REGEX:如何从URL获取YouTube视频ID?](http://stackoverflow.com/questions/3452546/javascript-regex-how-to-get-youtube-video-id-from-url ) –

回答

1

你可以从错误信息看,以某种方式通过你的代码生成的正则表达式是无效的:

//^.*(youtu.be/|v/|u/w/|embed/|watch?v=|&v=|?v=)([^#&?]*).*// 

其原因在于,您将整个正则表达式字面值置于一个字符串内:

var regExp = "/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^‌​#\&\?]*).*/"; 

这可不行,一方面是因为\也是在字符串中的逃逸包机,所以当你写&v=|\?v=,什么是传递给正则表达式引擎是&v=|?v=(和|?无效)。

只需使用该正则表达式字面:

var regExp = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=|\?v=)([^‌​#\&\?]*).*/; 
+0

Felix,我在下面添加了我的完整代码。 –

+0

更改了我的问题 –

+0

我将整个功能复制到浏览器的控制台中,但没有出现语法错误。与正则表达式相关的代码很好。 –

相关问题