1

我对一些旨在解析链接的 javascript 有疑问(以便在适当的情况下嵌入视频播放器)。在 Chrome 中手动测试时它可以正常工作,但是当我在不同的浏览器中运行自动化测试套件时,它就不行了。

var n = childNodes[i];
var html = n.nodeValue;

var urlVimeo0 = /http:\/\/(www\.)?vimeo\.com\/(\d+)($|\/)/;
var urlVimeo1 = /http:\/\/(www\.)?vimeo\.com\/(\d+)($)/;
var urlVimeo2 = /http:\/\/(www\.)?vimeo\.com\/(\d+)(\/)/;
var urlVimeo3 = /http:\/\/(www\.)?vimeo\.com\/(\d+)$/,
var urlVimeo4 = /http:\/\/(www\.)?vimeo\.com\/(\d+)\//,
var urlVimeo5 = /http:\/\/(www\.)?vimeo\.com\/(\d+)/;

// Comments show output when run in Poltergeist/PhantomJS
console.log('"'+html+'"'); // "http://vimeo.com/26278283​"
console.log(html.match(urlVimeo0)); // null
console.log(html.match(urlVimeo1)); // null
console.log(html.match(urlVimeo2)); // null
console.log(html.match(urlVimeo3)); // null
console.log(html.match(urlVimeo4)); // null
console.log(html.match(urlVimeo5)); // http://vimeo.com/26278283,,26278283

// Output in Chrome (same order)
// "http://vimeo.com/26278283" 
// ["http://vimeo.com/26278283", undefined, "26278283", "", index: 0, input: "http://vimeo.com/26278283"] 
// ["http://vimeo.com/26278283", undefined, "26278283", "", index: 0, input: "http://vimeo.com/26278283"] 
// null 
// ["http://vimeo.com/26278283", undefined, "26278283", index: 0, input: "http://vimeo.com/26278283"] 
// null
// ["http://vimeo.com/26278283", undefined, "26278283", index: 0, input: "http://vimeo.com/26278283"] 

原来的 ( urlVimeo0) 在 Chrome 中工作,但是当我使用 Poltergeist 作为测试套件的一部分运行它时,当位之后有任何内容与数字匹配时,什么都不起作用。两者都是基于 webkit 的,所以我不知道为什么美元/斜线会导致失败。

4

1 回答 1

0

TL;DR避开你的美元符号/foo\$/,并且 PhantomJS 使用一个非常旧版本的 Webkit,它对正则表达式语法的支持与 Chrome 不同。

--

你有两个潜在的问题。

首先是你的用法$;请注意,在正则表达式中,它表示字符串的结尾(并且^表示字符串的开头)。所以/foo$/会匹配"a_foo"不会匹配"foo_a",也不会匹配"foo$"

如果您实际上是在尝试匹配字符串中的美元符号,则需要对其进行转义:/foo\$/.

第二个问题是,虽然 PhantomJS(Poltergeist 在后台使用)基于 Webkit,但它是 Webkit 的一个古老、糟糕的分叉版本,仅由 PhantomJS 使用,它缺乏许多现代特性,包括对正则表达式语法的各种扩展. 因此,您将看到 Chrome 对您的正则表达式的解释与 PhantomJS 之间的一些差异。

如果您想深入了解可用的浏览器兼容性表/规范,可以从这里开始:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Specifications 。ECMAScript 3 规范中可用的任何东西都可能在 PhantomJS 中可用。之后发生的任何事情都是可疑的。

于 2017-03-09T07:19:36.803 回答