Посмотрел уже в нескольких скриптах, как люди парсят update.ver регулярками и немного ужаснулся.
Предлагаю свой метод разбора update.ver, код сразу говорю не идеален (это можно сказать набросок).
Код: Выделить всё
function Parse_update($file, $platform, $lang)
{
$start = microtime(true);
if (!is_dir("tmp")) mkdir("tmp", 0777);
// $updateOrig = fopen($file, "r");
// $updateTemp = fopen('tmp//update_temp.ver', "w");
$updateOrig = file_get_contents($file);
$pattern = '/(\(\d+\))/';
$replace = '"$1"';
// $o = fread($updateOrig, filesize('update2.ver'));
// $r = preg_replace($pattern, $replace, $o);
if (file_exists("tmp//update.ver")) {
unlink("tmp//update.ver");
}
file_put_contents("tmp//update.ver", preg_replace($pattern, $replace,$updateOrig));
// fwrite($updateTemp, $r);
// fclose($updateOrig);
// fclose($updateTemp);
$UpdateArray = parse_ini_file('tmp//update.ver', true);
// print_r($UpdateArray);
$urls = array();
$i=0;
foreach ($UpdateArray as $sec){
if (array_key_exists('file', $sec)) {
if (array_key_exists('platform', $sec)) {
// echo $sec['platform']."\n";
$flag = false;
$flag2 = false;
if (is_array($platform)) {
$flag = in_array($sec['platform'], $platform);
} else $flag = ($sec['platform'] == $platform);
if ($flag) {
if (array_key_exists('language', $sec)){
if (is_array($lang)) {
$flag2 = in_array($sec['language'], $lang);
} else $flag2 = strcmp((string)$sec['language'], $lang);
if ($flag2) {
$urls[$i] = $sec['file'];
++$i;
}
} else {
$urls[$i] = $sec['file'];
++$i;
}
}
}
}
}
$end = microtime(true);
$runtime = $end - $start;
echo "Время выполнения скрипта: ". $runtime ." микросекунд.\n";
return $urls;
}
Оформил в виде функции, в функцию мы передаем:
- файл - указатель на update.ver
тип платформы (x86, x64, winnt32 и winnt64) - может принимать строку, если нужно только одну платформу, либо массив.
язык - точно так же строка или массив, передается десятичный код языкового пакета
Все основано на том, что update.ver - это почти .ini файл, и для его разбора функцией parse_ini_file нужно экранировать символы скобок
() в кавычки.
При желании можно таким образом легко изменить под свои нужды и сохранить update.ver, так же можно легко брать список серверов с обновлениями да и много, что еще.
Пример использования:
Код: Выделить всё
$lang = 1049;
$platform = 'x86';
$file = "update.ver";
$lang_array = array('1049', '1033');
$platform_array = array('winnt32','winnt64','x86','x64');
$DownloadUrl = Parse_update($file, $platform, $lang);
$DownloadUrl2 = Parse_update($file, $platform_array, $lang_array);
print_r($DownloadUrl);
print_r($DownloadUrl2);
echo("Finish !!! \n");
Думаю в примере должно быть все понятно, в переменные
$DownloadUrl и
$DownloadUrl2 мы получаем массивы с путями до файлов обновления из update.ver
Извиняюсь за сумбур в посте, просто времени очень не хватает.