Intereting Posts
Эмуляция названных параметров функции в PHP, хорошая или плохая идея? Как оптимизировать использование памяти php-процесса? Как проверить, существует ли значение массива? Обфускание строковых значений в исходном коде PHP Сгладить многомерный ассоциативный массив к одному одномерному массиву ссылок в PHP Ошибка Joomla: «Незаконные переменные _files или _env или _get или _post или _cookie или _server или _session или globals переданы скрипту ' Почему «нет такого файла или каталога … autoload.php» при доступе к приложению Laravel? Библиотека PHP GD изменяет размер Примеры Bigquery + PHP Laravel 5.4 Внутренняя ошибка: не удалось получить значение по умолчанию Динамически созданные zip-файлы ZipStream в PHP не будут открываться в OSX Файлы, не хранящиеся в правильной папке Как работает локальная настройка LC_NUMERIC в PostgreSQL? Есть ли законное использование для простых строк в PHP? Ошибка анализа: ошибка синтаксиса, неожиданный T_BOOLEAN_AND, ожидающий '(' in

Лучший способ разобрать Javascript-файл в PHP, чтобы извлечь массив, определенный внутри него

У меня есть Javascript-файл, который автоматически создается из унаследованного приложения с огромным массивом, определенным в нем (и несколькими другими функциями и т. Д.). Этот файл javascript выполняет поиск по содержимому, но со временем он вырос до более чем 2 МБ, что может не сильно звучать, но вы должны загружать его каждый раз, когда хотите выполнить поиск с помощью этого конкретного веб-приложения. Излишне говорить, что представление ужасно. Я хочу с минимальными усилиями положить оболочку вокруг js, чтобы вместо вызова js на стороне клиента он вызывал мой новый php-скрипт, который выполняет поиск по контенту.

Макет сгенерированного JS-файла будет таким же каждый раз, когда он будет сгенерирован, поэтому я мог бы написать кучу конкретных планок и разделов, но тогда я думал, что regexp может быть способом, но, честно говоря, я не конечно, поэтому я подумал, что просто попрошу вас прекрасных людей.

Пример источника:

Page[0]=new Array("Some text1","More text1","Final Text1","abc.html"); Page[1]=new Array("Some text2","More text2","xyz.html"); 

Как вы можете видеть, в каждой строке массива имеется по крайней мере одна запись, а конечная запись – имя искомого файла.

Во всяком случае, вопрос в том, лучше ли регулярное выражение (и если да, то некоторые предлагаемые шаблоны будут большими). или если я должен разделить это на split и т. д.

ура

Related of "Лучший способ разобрать Javascript-файл в PHP, чтобы извлечь массив, определенный внутри него"

Вы ищете что-то вроде этого. Заметьте, что файл .js был локальным, поэтому я использовал file() для его загрузки в массив. Для вашего реального скрипта вам, вероятно, понадобится file_get_contents() если ваш php не сможет получить доступ к локальному файлу .js.

 <?php $lines = file('test.js'); $pages = array(); foreach($lines as $line) { if(strpos($line, 'new Array') != false) { preg_match('/Page\[\d\]\s?\=\s?new Array\((\"(.*)",?\s?\n?)+\);/', $line, $matches); $values = preg_split('/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/', $matches[1]); $currNo = count($pages); $pages[$currNo] = array(); for($i = 0; $i < count($values); $i++) { array_push($pages[$currNo], trim($values[$i], '"')); } } } var_dump($pages); 

Для вашего примера результат будет следующим:

 array(2) { [0]=> array(4) { [0]=> string(10) "Some text1" [1]=> string(10) "More text1" [2]=> string(11) "Final Text1" [3]=> string(8) "abc.html" } [1]=> array(3) { [0]=> string(10) "Some text2" [1]=> string(10) "More text2" [2]=> string(8) "xyz.html" } } 

Наслаждайтесь!

Как насчет использования PHP-Javascript-интерпретатора (например, J4P5 )?
Я никогда не пробовал это сам, но идея состоит в том, чтобы запустить js-файл на стороне сервера и прочитать этот массив из памяти. Таким образом, вы избегаете как regexp, так и пользователей, загружающих js-файл.

Используйте AJAX и полностью не разбирайте JS для этого. С помощью AJAX вы можете легко отправить эти массивы в файл PHP, разработать содержимое и снова вернуться к JavaScript.

Я бы взял на себя это преобразование JS в PHP и eval() . ( ГПБП )

Просто шучу на этом. ОДНАКО, вы можете конвертировать в PHP и токенизировать его. Я думаю, что это может быть лучше в случаях, когда регулярное выражение будет слишком сложным.

Я думал, что у меня есть правильное решение, но, по-видимому, это превратило PHP в JS (meh ; P ). Я попробую свою небольшую попытку здесь …

 $js='Page[0]=new Array("Some text1","More text1","Final Text1","abc.html"); '. 'Page[1]=new Array("Some text2","More text2","xyz.html");'; // Convert JS variable names to PHP (this seems pretty consistent in your app) $php='<?php '.str_replace('Page[','$Page[',$js); // '---PHP tag, tells tokenizer this is PHP code // Parse the PHP-JS thingy token_get_all($php); 

Пытаться

 /Page\[\d\]=new Array\((.*)\);/simU 

Пример:

 $js = <<< JS Page[0]=new Array("Some text1","More text1","Final Text1","abc.html"); Page[1]=new Array("Some text2","More text2","xyz.html"); JS; preg_match_all('/Page\[\d\]=new Array\((.*)\);/simU', $js, $matches); print_r(array_map('str_getcsv', $matches[1])); 

Выход ( живая демонстрация ):

 Array ( [0] => Array ( [0] => Some text1 [1] => More text1 [2] => Final Text1 [3] => abc.html ) [1] => Array ( [0] => Some text2 [1] => More text2 [2] => xyz.html ) )