2017-01-12 81 views
-1

正在使用正則表達式存在一個非常奇怪的問題。這是我的表達:正則表達式匹配在線,但不是在運行時

const csrfRegex = /"csrf_token": "((\\"|[^"])*)"/ig;

這樣做的目的是從一個Javascript對象拉出CSRF令牌上刮下的網站。頁面的摘譯如下:

[...] 
<script type="text/javascript">window._sharedData = { "config": {"viewer": null, "csrf_token": "rYzP3AWdRFIoz9UJbyholRAX5QSiirCR"}, "display_properties_server_guess": {"viewport_width": 360, "pixel_ratio": 1.5}, "entry_data": {"LoginAndSignupPage": [{}]}, "platform": "web", "qe": {"discovery": {"p": {}, "g": ""}, "us": {"p": {"use_continue_text": "false"}, "g": "continue_vs_signup_text_control_03"}, "ebd": {"p": {}, "g": ""}, "gql": {"p": {}, "g": ""}, "freq": {"p": {}, "g": ""}, "br": {"p": {}, "g": ""}, "feed": {"p": {}, "g": ""}, "su_universe": {"p": {}, "g": ""}, "profile": {"p": {}, "g": ""}, "us_li": {"p": {}, "g": ""}}, "language_code": "en", "environment_switcher_visible_server_guess": true};</script> 
[...] 

如果我在網上測試它使用Regex101,第一個捕獲組正確與它匹配:https://regex101.com/r/zDxPFw/1

然而,在我的代碼是無法找到匹配,和返回if語句內部:

let csrf_scrape = csrfRegex.exec(body); 

// Both must have a length of at least 2 
if (!csrf_scrape || !csrf_scrape.length) { 
    console.log(body); 
    return next(`No CSRF token found`); 
} 

let csrf = csrf_scrape[1]; 
return next(null, csrf); 

任何想法爲什麼會發生這種情況?

+0

http://stackoverflow.com/help/mcve – melpomene

+1

csrf = csrf_scrape [0]?我認爲... –

+0

你的主要問題可能是'/ g'標誌,但很難說沒有看到代碼的其餘部分。 – melpomene

回答

0

首先,我不認爲你需要內逮住組,所以這應該是足夠我想象:

var csrfRegex = /"csrf_token": "((?:\\"|[^"])*)"/i; 

使用(?:)是一個非捕獲組。然後你就可以很容易地得到這樣說:

var value = text.match(csrfRegex)[1]; 

g標誌必須str.match()被刪除返回組值。

相關問題