2015-02-25 5 views
0

Мне нужно открыть JS-файл с PHP, найти json var в этом файле и преобразовать его в php-массив.Проанализируйте сценарий JS с использованием PHP и REGEX для получения значения переменной JS

Прямо сейчас я не могу понять, какое регулярное выражение использовать.

// 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); 

Я нашел несколько примеров для этого, но никто не будет работать для меня. Любой, кто имеет приличные навыки в regex, мог бы мне помочь?

Бен

изменения: добавлена ​​часть файла ЯШ:

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() { ... } 
+0

try '" #pveapi \ s * = \ s * ({[^}] *}) # "' –

+0

спасибо за ответ, я попробовал, но он все тот же, а не совпадение. – Asterix34

+0

"/pveapi\s*\=\s*([^Ext\.onReady]*)/" – hanshenrik

ответ

3

В этом случае конец может быть найден путем сопоставления с запятой в конце строки:

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

спасибо, это именно то, что я хотел - моя учетная запись слишком молода для продвижения, но я отметил ее как разрешенную. – Asterix34

+0

и когда pveapi ДОЛЖЕН содержать точку с запятой где-то? : p – hanshenrik

+0

@hanshenrik Он может содержать точку с запятой, только не в конце строки. –

0

По умолчанию двигатель RegEx работает с жадностью на отдельных линиях, поэтому вам нужно будет сказать, что нужно делать наоборот - RegEx, который вы, похоже, ищете, будет

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

Что это делает:

  • #
    Начало выражение
  • \s
    Убедитесь, что имя переменной предшествует пробел, так что это не часть другого имени переменной
  • pveapi
    Найти переменную
  • \s*=\s*
    Убедитесь, что это знак равенства с дополнительным пробелом вокруг него
  • (.*?);\s*$
    получить как несколько символов, насколько это возможно, прежде чем найти точку с запятой - то есть все символы до первой точки с запятой, которая не следует только необязательному пропуск и конец строки
  • #ms
    End выражение и сказать ему, чтобы . матч окончания строк тоже и матч $ до окончания каждой строки
+0

спасибо за ответ и подробности, есть маленькая опечатка в вашем ответе в последней части, вы имели в виду #ms вместо #s. – Asterix34

+0

Да, я видел, что мой ответ может быть более полным, поэтому его отредактировать, чтобы добавить пробелы и строку, заканчивающиеся на «stop clause» и «m», чтобы использовать его;) – Flygenring