簡體   English   中英

為什么在Chrome中可以使用的正則表達式在Poltergeist / PhantomJS中不起作用?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM