У меня есть 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 и т. д.
ура
Вы ищете что-то вроде этого. Заметьте, что файл .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 ) )