Javascript YouTube Regex:测试了视频和播放列表ID,但Node.js赢了';T
我有以下regex,它已经在三个不同的网站上进行了测试,以匹配所有YouTube链接,还捕获了视频ID和可选播放列表ID。尽管如此,我的节点应用程序只能获取视频ID: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}))?(?:(?:\?|\&
/(?: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符号“&”的检测,所以它现在可以工作了。