要抓取的正则表达式 JavaScript

Regex To Scrape JavaScript

我正在使用 casperjs 抓取网页,它适用于全局 JavaScript 值,但现在我被困在像这样从 jQuery 闭包中取出变量:

$(document).ready(function(){
var storeData = {
lon: "-5.91829",
lat: "54.65583",
name: "John Smith"
};
SOMEGLOBALVAR.storeFinder.addStore(storeData);
});

我找不到获取经度、纬度和名称的方法!

所以我决定 select 脚本标签,然后使用正则表达式从脚本标签中提取代码。这是我使用在线编辑器构建的丑陋的正则表达式:

/var storeData = {\n\t*id.*,\n\t.*(\n\t)*\n\t*.*\n\t*.*\n\t*[a-zA-Z: 0- 9,"]*\n\t*[a-zA-Z: 0-9,"]*\n\t*[a-zA-Z: 0-9,"]*\n\t*\};/g

所以我的问题分为两部分:

  1. 有没有办法在该函数中访问经度、纬度和名称? (我正在抓取,所以我不能改变函数本身)

  2. 如何使我的正则表达式更好?

给你,你可以通过使用带有捕获组的正则表达式来提取这些值(有 3 个):

lon: "([^"]*)"[\s\S]*?lat:\s+"([^"]*)"[\s\S]*?name:\s+"([^"]*)".*?

请注意,我使用 [\s\S] 来匹配换行符,因为 JavaScript 中没有单行选项。

var re = /lon: "([^"]*)"[\s\S]*?lat:\s+"([^"]*)"[\s\S]*?name:\s+"([^"]*)".*?/; 
    var str = 'var storeData = {\nlon: "-5.91829",\nlat: "54.65583",\nname: "John Smith"\n};';
     
    if ((m = re.exec(str)) !== null) {
        document.getElementById("res").innerHTML = m[1] + "<br>" + m[2] + "<br>" + m[3];
    }
<div id="res"/>