-1

我只是偶然发现了这种非常奇怪的行为。我有一个从嵌入式 iframe 中提取 Youtube 视频 ID 的正则表达式。正则表达式如下所示:

var regex = /(?:youtu\.be|youtube\.com|ytimg\.com|youtube-nocookie\.com).*(?:\/|\?v=|\&v=|\?video_id=|\&video_id=)([\w\-_]{11})[^\w\-_]?/ig;

我现在有一个嵌入式 Youtube iframe,如下所示:

<iframe id="ytplayer" type="text/html" width="300" height="200"
  src="//www.youtube.com/embed/M7lc1UVf-VE?autoplay=0&origin=//example.com"
  frameborder="0"/>

如您所见,该正则表达式应与src该元素的属性匹配。但是,如果我执行以下代码,它将返回false

regex.test( $('#ytplayer').attr('src') );

你会说“好吧,你的正则表达式显然是错误的,再检查一次”。但是看看这个:

regex.test( $('#ytplayer').attr('src').toString() );

这将返回true,即使它是完全相同的代码,只是添加了toString(). 是的,.attr('src')已经返回了一个字符串!为什么是这样?我可以在 Chrome 和 Firefox 中重现它,所以它很可能不是 JS 实现中的错误。

(你可以在这里找到一个 JsFiddle 来试试)

4

1 回答 1

3

由于您使用正则表达式进行测试,请不要使用g标志

var regex = /(?:youtu\.be|youtube\.com|ytimg\.com|youtube-nocookie\.com).*(?:\/|\?v=|\&v=|\?video_id=|\&video_id=)([\w\-_]{11})[^\w\-_]?/i;

当您使用该g标志时,正则表达式处理器将记住上次搜索的位置,并在下一次搜索中从那里继续。如果在第二次搜索中再次没有匹配,则索引将重置为 0;

演示:小提琴

如果您想更清楚地查看此演示,其中一个接一个地重复相同的搜索,其中第一个匹配,第二个失败

于 2013-05-15T10:25:55.857 回答