我使用的是非现代JavaScript,我定义的字符串如下:
"//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0"
我只想抽出DmYK479EpQc
,但我不知道长度。我确实知道我想要/
之后和?
是否有一些简单的JavaScript可以解决此问题?
答案 0 :(得分:2)
使用URL
对象吗?
console.log(
(new URL("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0", location.href)).pathname
.split('/')
.pop());
为什么?因为我很可能会组成一个破坏正则表达式的URL(尽管对于youtube来说这不太可能)
答案 1 :(得分:1)
This expression可能会帮助您,并且可能会更快:
(d\/)([A-z0-9]+)(\?)
此图显示了表达式的工作方式,您可以在此link中可视化其他表达式:
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const str = `//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0`;
const subst = `$3`;
// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);
console.log('Substitution result: ', result);
此JavaScript代码段使用简单的100万次for
循环来显示该表达式的性能。
const repeat = 1000000;
const start = Date.now();
for (var i = repeat; i >= 0; i--) {
const string = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
var match = string.replace(regex, "$3");
}
const end = Date.now() - start;
console.log("YAAAY! \"" + match + "\" is a match ");
console.log(end / 1000 + " is the runtime of " + repeat + " times benchmark test. ");
答案 2 :(得分:1)
非正则表达式如何
console.log("//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0".split('/').pop().split('?')[0]);
答案 3 :(得分:0)
一个选项使用正则表达式替换:
var url = "//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0";
var path = url.replace(/.*\/([^?]+).*/, "$1");
console.log(path);
上面的正则表达式模式表明:
.* match and consume everything up to and
/ including the last path separator
([^?]+) then match and capture any number of non ? characters
.* then consume the rest of the input
然后,我们只替换为第一个捕获组,该捕获组对应于最终路径分隔符之后但查询字符串开始之前的文本,如果URL有一个。
答案 4 :(得分:0)
我不会给出一段代码,因为这是一个相对简单的算法,易于实现。
请注意,这些链接具有这种格式(如果我输入错了,请纠正我):
https://
或http://
www.youtube.com/
embed/
DmYK479EpQc
)?parameters
(请注意,它们始终以字符?
开头)您需要视频的ID,因此可以将字符串拆分为这些部分,如果将这些部分存储在一个数组中,则可以确保ID位于第3个位置。
该数组的外观示例如下:
['https://', 'www.youtube.com', 'embed', 'DmYK479EpQc', '?vq=hd720&rel=0']
答案 5 :(得分:0)
您可以使用此正则表达式
.*
匹配并消耗掉所有内容
[A-z0-9]+
然后匹配并捕获A-z之间的任何数字和字符
.*
然后使用其余的输入
const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
const regex = /(.*)(d\/)([A-z0-9]+)(\?)(.*)/gm;
const position = '$3';
let result = ytUrl.replace(regex, position);
console.log('YouTube ID: ', result);
此正则表达式只是将字符串分成不同的部分,而YouTube ID位于第3位。
另一个解决方案是使用split
。此方法将字符串拆分为子字符串数组。
const ytUrl = '//www.youtube.com/embed/DmYK479EpQc?vq=hd720&rel=0';
let result = ytUrl.split('/').pop().split('?').shift()
console.log('YouTube ID: ', result);
在此示例中,我们使用/
作为分隔符来拆分URL。然后,我们使用pop
方法获取数组的最后一个元素。最后,我们再次使用?
作为分隔符进行拆分,并使用shift
方法获取数组的第一个元素。