我正在尝试使用此处提供的这个优秀的RegEx来从任何youtube类型网址中获取视频ID:
parse youtube video id using preg_match
// getting our youtube url from an input field.
var yt_url = $('#yt_url').val();
var regexp = new RegExp('%(?:youtube(?:-nocookie)?\\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\\.be/)([^"&?/ ]{11})%','i');
var videoId = yt_url.match( regexp ) ;
console.log('vid: '+videoId);
我的控制台总是给我一个 null videoId。我错误地在regexp var中转义了什么吗?我添加了第二个反斜杠来逃避单个反斜杠。
抓我的头?
答案 0 :(得分:0)
%
是您从中获取链接的PHP的分隔符,Javascript在使用new RegExp()
时不会指望分隔符。此外,\\.
似乎应该替换为\.
尝试:
var regexp = new RegExp('(?:youtube(?:-nocookie)?\.com/(?:[^/]+/.+/|(?:v|e(?:mbed)?)/|.*[?&]v=)|youtu\.be/)([^"&?/ ]{11})','i');
此外,您可以使用Javascript的/.../
分隔符逐字创建正则表达式,但之后您需要转义所有/
s:
var regexp = /(?:youtube(?:-nocookie)?\.com\/(?:[^/]+\/.+\/|(?:v|e(?:mbed)?)\/|.*[?&]v=)|youtu\\.be\/)([^"&?\/ ]{11})/i;
<强>更新强>
快速更新,以解决关于文字表达式(/ab+c/
)与构造函数(new RegExp("ab+c")
)的效率的评论。文档说:
正则表达式文字在加载脚本时提供正则表达式的编译。当正则表达式保持不变时,请使用它以获得更好的性能。
和
使用构造函数提供正则表达式的运行时编译。当您知道正则表达式模式将要更改时,或者您不知道该模式并从其他源(例如用户输入)获取该模式时,请使用构造函数。
因为你的表达式总是静态的,所以我会说从字面上创建它(第二个例子)会稍快一些,因为它是在加载时编译的(但是,不要把它混淆为认为它不会创建一个{ {1}}对象)。这个小差异用quick benchmark test确认。