使用PHP和REGEX解析JS脚本以获取JS变量值

时间:2015-02-25 13:00:00

标签: javascript php regex json proxmox

我需要从PHP打开一个JS文件,在这个文件中找到一个json var,并将其转换为php数组。

现在我无法弄清楚要使用哪个正则表达式。

// get the js file
$file = file_get_contents ("http://pve.proxmox.com/pve2-api-doc/apidoc.js");

// extract the json content of var pveapi
if ( preg_match ( "#pveapi = ({[^}]*})#", $file, $infoJson ) ) {
    $arrJson = json_decode ( $infoJson [1], true );
}

// shows nothing so far :((
print_r($arrJson);

我发现很少有这样做的例子,但没有一个能适合我。任何在正则表达式方面都有不错技能的人都能帮帮我吗?

编辑:添加了js文件的一部分:

var pveapi = [
   {
      "info" : {
         "GET" : {
            "parameters" : {
               "additionalProperties" : 0
            },
            "permissions" : {
               "user" : "all"
            },
            "returns" : {
               "type" : "array",
               "items" : {
                  "type" : "object",
                  "properties" : {}
               },
               "links" : [
                  {
                     "rel" : "child",
                     "href" : "{name}"
                  }
               ]
            },
            "name" : "index",
            "method" : "GET",
            "description" : "Cluster index."
         }
      }
    }
];

Ext.onReady(function() { ... }

2 个答案:

答案 0 :(得分:3)

在这种情况下,可以通过在一行末尾匹配分号找到结尾:

if (preg_match('/^var pveapi = (.*?);$/ms', $js, $matches)) {
    $data = json_decode($matches[1]);
    print_r($data);
}

答案 1 :(得分:0)

默认情况下,RegEx引擎会在各个行上贪婪地运行,因此您必须告诉它执行相反的操作 - 您似乎正在寻找的RegEx将是

#\spveapi\s*=\s*(.*?);\s*$#s

它的作用是:

  • #
    启动表达式
  • \s
    确保变量名称前面有空格,因此它不是不同变量名称的一部分
  • pveapi
    找到变量
  • \s*=\s*
    确保周围有可选空格的等号
  • (.*?);\s*$
    在找到分号之前获取尽可能少的字符 - 即直到第一个分号后面的所有字符,后面只跟随可选的空格和一行结尾
  • #ms
    结束表达式并告诉它让.匹配行结尾并将$与每行的结尾匹配