使用 PHP 和 REGEX 解析 JS 脚本以获取 JS 变量值
Parse a JS script using PHP and REGEX to get a JS variable value
我需要从 PHP 打开一个 JS 文件,在这个文件中找到一个 json 变量,并将它转换成一个 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);
我发现很少有这样的例子,但 none 对我有用。任何具有正则表达式技能的人都可以帮助我吗?
本
编辑:添加了 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() { ... }
在这种情况下,可以通过匹配行尾的分号找到结尾:
if (preg_match('/^var pveapi = (.*?);$/ms', $js, $matches)) {
$data = json_decode($matches[1]);
print_r($data);
}
默认情况下,RegEx 引擎在单独的行上贪婪地运行,所以你必须告诉它做相反的事情——你似乎正在寻找的 RegEx 是
#\spveapi\s*=\s*(.*?);\s*$#s
它的作用是:
#
启动表达式
\s
确保变量名前面有空格,所以它不是不同变量名的一部分
pveapi
找到变量
\s*=\s*
确保等号周围有可选的空格
(.*?);\s*$
在找到分号之前获取尽可能少的字符——即所有字符,直到第一个分号后仅跟可选的空格和行结尾
#ms
结束表达式并告诉它让 .
也匹配行结尾并将 $
匹配到每行的结尾
我需要从 PHP 打开一个 JS 文件,在这个文件中找到一个 json 变量,并将它转换成一个 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);
我发现很少有这样的例子,但 none 对我有用。任何具有正则表达式技能的人都可以帮助我吗?
本
编辑:添加了 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() { ... }
在这种情况下,可以通过匹配行尾的分号找到结尾:
if (preg_match('/^var pveapi = (.*?);$/ms', $js, $matches)) {
$data = json_decode($matches[1]);
print_r($data);
}
默认情况下,RegEx 引擎在单独的行上贪婪地运行,所以你必须告诉它做相反的事情——你似乎正在寻找的 RegEx 是
#\spveapi\s*=\s*(.*?);\s*$#s
它的作用是:
#
启动表达式\s
确保变量名前面有空格,所以它不是不同变量名的一部分pveapi
找到变量\s*=\s*
确保等号周围有可选的空格(.*?);\s*$
在找到分号之前获取尽可能少的字符——即所有字符,直到第一个分号后仅跟可选的空格和行结尾#ms
结束表达式并告诉它让.
也匹配行结尾并将$
匹配到每行的结尾