YouTube的正则expression式:经testing挑选video和播放列表ID,但Node.js不会

我有以下正则expression式,已经过三个不同的网站testing,以匹配所有的YouTube链接,也捕获videoID和一个可选的播放列表ID。 尽pipe如此,我的Node应用程序除了videoID之外没有任何其他内容:

/(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-|_){11})(?:(?:\?|\&)index=((?:\d){1,3}))?(?:(?:\?|\&)list=((?:\w|-|_){24}))?(?:\S+)?/g 

正则表达式可视化

Debuggex演示

我的实际代码:

 var youtube = /(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-|_){11})(?:(?:\?|\&)index=((?:\d){1,3}))?(?:(?:\?|\&)list=((?:\w|-|_){24}))?(?:\S+)?/g; ansCopy = ansCopy.replace(youtube, "^~$1~^~$3~^"); 

使用“ http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46 ”作为testingstring,这应该产生string:

 "^~VWKdcalZTaA~^~UUlucBMqhrYW4PWuIp8Um_cg~^" 

但它会产生:

 "^~VWKdcalZTaA~^~~^" 

这是一个URL,所以为什么不使用Node.js的URL模块。

 var url = require('url'); var youtube = url.parse('http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46'); /*{ protocol: 'http:', slashes: true, auth: null, host: 'www.youtube.com', port: null, hostname: 'www.youtube.com', hash: null, search: '?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46', query: 'v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46', pathname: '/watch', path: '/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46', href: 'http://www.youtube.com/watch?v=VWKdcalZTaA&list=UUlucBMqhrYW4PWuIp8Um_cg&index=46' }*/ var query = querystring.parse(youtube.query); /*{ v: 'VWKdcalZTaA', list: 'UUlucBMqhrYW4PWuIp8Um_cg', index: '46' }*/ 

事实certificate,正则expression式没有正确地拾取播放列表ID,因为一些卫生代码会用它的HTML符号replace掉第一个“&”,干扰正则expression式,只返回与videoID匹配。 我的正则expression式现在接受“&”和“&” 在必要时:

 (?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+(?:&|&);v=))((?:\w|-|_){11})(?:(?:\?|&|&)index=((?:\d){1,3}))?(?:(?:\?|&|&)list=((?:\w|-|_){24}))?(?:\S+)? 

正则表达式可视化

Debuggex演示