[英]Why does a regex that works in Chrome not work in Poltergeist/PhantomJS?
我有一些用於解析鏈接的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的,所以我不知道為什么美元/斜線導致失敗。
TL; DR轉義了美元符號/foo\\$/
,並且PhantomJS使用了Webkit的真正舊版本,它對正則表達式語法的支持與Chrome不同。
-
您有兩個潛在的問題。
首先是您對$
的使用情況; 請注意,在正則表達式中,它表示字符串的結尾( ^
表示字符串的開頭)。 因此/foo$/
將匹配"a_foo"
但不匹配"foo_a"
,也將不匹配"foo$"
。
如果您實際上要在字符串中匹配美元符號,則需要對其進行轉義: /foo\\$/
。
第二個問題是,雖然PhantomJS(這騷靈罩下使用) 是基於WebKit,它是一個古老的,低劣的,Webkit的的分叉版本僅用於PhantomJS,它缺乏很多現代的功能,包括各種擴展正則表達式語法。 因此,您會發現Chrome對正則表達式的解釋與PhantomJS的解釋有所不同。
如果您想瀏覽可用的瀏覽器兼容性表/規格,可以從這里開始: https : //developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/RegExp#Specifications 。 ECMAScript 3規范中可用的任何內容都可以在PhantomJS中使用。 發生的任何事情都是可疑的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.