【问题标题】:Parse a JS script using PHP and REGEX to get a JS variable value使用 PHP 和 REGEX 解析 JS 脚本以获取 JS 变量值
【发布时间】:2015-04-27 11:39:36
【问题描述】:

我需要从 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() { ... }

【问题讨论】:

  • 试试"#pveapi\s*=\s*({[^}]*})#"
  • 感谢解答,我试过了,还是一样,不匹配。
  • "/pveapi\s*\=\s*([^Ext\.onReady]*)/"
  • 如果您知道您需要的 pveapi 是 var pveapi = 在您的 javascript 中的第一个实例,并且您知道 pveapi 不包含字符串 Ext.onReady ,并且您知道在pveapi,有一个 Ext.onReady ,这应该可以工作......不幸的是,我认为你需要一个成熟的 javascript 解释器来可靠地获取代码

标签: javascript php regex json proxmox


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这正是我想要的 - 我的帐户太年轻,无法投票,但我将其标记为已解决。
  • 当 pveapi 在某处包含分号时? :p
  • @hanshenrik 它可能包含分号,只是不在行尾。
  • 哦,没想到。除非你知道javascript被美化了,否则仍然不可靠,我认为~
  • @hanshenrik 是的,如果你不能依赖换行符而不是字符串值的一部分,它会变得更棘手:)
【解决方案2】:

默认情况下,RegEx 引擎在各个行上贪婪地运行,所以你必须告诉它做相反的事情——你似乎正在寻找的 RegEx 是

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

它的作用是:

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

【讨论】:

  • 感谢您的回答和详细信息,您在最后一部分的回答中几乎没有错字,您的意思是#ms 而不是#s。
  • 是的,我看到我的答案可能更完整,所以编辑它以将空格和行结尾添加到“停止子句”和 m 以使用它;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多