Javascript YouTube Regex:测试了视频和播放列表ID,但Node.js赢了';T

Javascript YouTube Regex:测试了视频和播放列表ID,但Node.js赢了';T,javascript,regex,node.js,hyperlink,youtube,Javascript,Regex,Node.js,Hyperlink,Youtube,我有以下regex,它已经在三个不同的网站上进行了测试,以匹配所有YouTube链接,还捕获了视频ID和可选播放列表ID。尽管如此,我的节点应用程序只能获取视频ID: /(?:https?:\/\/)?(?:www\.)?(?:youtu\.be\/|youtube\.com\/(?:embed\/|v\/|watch\?v=|watch\?.+&v=))((?:\w|-|_){11})(?:(?:\?|\&)index=((?:\d){1,3}))?(?:(?:\?|\&

我有以下regex,它已经在三个不同的网站上进行了测试,以匹配所有YouTube链接,还捕获了视频ID和可选播放列表ID。尽管如此,我的节点应用程序只能获取视频ID:

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

我的实际代码:

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~^");
使用“”作为测试字符串,应生成以下字符串:

"^~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'
}*/

这是一个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'
}*/

事实证明,正则表达式没有正确提取播放列表ID,因为某些卫生代码会将第一个“&”替换为它的HTML符号对应项,干扰正则表达式,只返回与视频ID匹配的内容。我的正则表达式现在在必要时接受“&”和“&;”:

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


事实证明,由于某些卫生代码将第一个“&”替换为它的HTML符号对应项,正则表达式没有正确拾取播放列表ID,干扰正则表达式,只返回与视频ID匹配的内容。我的正则表达式现在在必要时接受“&”和“&;”:

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


真的有那么简单吗。。。?您从哪里获取querystring?querystring也是由Node.js提供的,因此我找到了正则表达式无法正确拾取的原因。我的代码正在解析URL中的所有&。如果可以的话,我会尽量避免使用正则表达式。我知道原因,但我的一个朋友一直拼命推正则表达式,我碰巧找到了“终极”YouTube链接正则表达式,然后我对其进行了改进。长话短说,一些净化代码不断干扰链接。我添加了可选的HTML符号“&”的检测,所以它现在可以工作了。真的那么简单吗。。。?您从哪里获取querystring?querystring也是由Node.js提供的,因此我找到了正则表达式无法正确拾取的原因。我的代码正在解析URL中的所有&。如果可以的话,我会尽量避免使用正则表达式。我知道原因,但我的一个朋友一直拼命推正则表达式,我碰巧找到了“终极”YouTube链接正则表达式,然后我对其进行了改进。长话短说,一些净化代码不断干扰链接。我添加了可选的HTML符号“&”的检测,所以它现在可以工作了。