2017-03-06 60 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

我將整個功能複製到瀏覽器的控制檯中,但沒有出現語法錯誤。與正則表達式相關的代碼很好。 –

相關問題