этаже тема
этаже тема
автор:SergiK_KilleR
мой вариант парсера:
PHP код:
function fields_defines(&$output,$url='http://github.com/mangos/mangos/raw/master/src/game/UpdateFields.h'){
$output = '';
$I = '\\b***91;A-Z_***93;***91;A-Z0-9_***93;*\\b';
$regex = "^\\s*($I)(\\s*)=\\s*(***91;0-9A-Z_(***93;(?:***91;0-9A-Z_)(\t+*/-***93;|\\s)****91;0-9A-Z_)***93;?),(.*)$";
$file = file($url);
$ex = false;
foreach ($file as $line) {
$line = rtrim($line);
if(preg_match("/(\w+) (\d{1}), (\d{1}), (\d{1}), (\d{4})/",$line)){
$version = preg_replace("/(\d{1}), (\d{1}), (\d{1}), (\d{4})/","\\1.\\2.\\3.\\4",$line)."\n";
}
if (preg_match("#$regex#i", $line, $regs)) {
$exp = str_replace(' ', '',preg_replace("#$I#i", "\\0", $regs***91;3***93;));
// разраничиваем '_END'-поля пустой строкой
$emptyline = (strpos($regs***91;1***93;,'_END')===false)? "" : "\n";
$line = "\tdefine('{$regs***91;1***93;}', ".$exp.");"/*.$regs***91;4***93;*/;
$output .= $line."\n".$emptyline;
}
}
$output = $version.$output;
}
или в виде массива:
PHP код:
function fields_arrays(&$output,$url='http://github.com/mangos/mangos/raw/master/src/game/UpdateFields.h'){
$output = '';
$output2 = '';
$I = '\\b***91;A-Z_***93;***91;A-Z0-9_***93;*\\b';
$regex = "^\\s*($I)(\\s*)=\\s*(***91;0-9A-Z_(***93;(?:***91;0-9A-Z_)(\t+*/-***93;|\\s)****91;0-9A-Z_)***93;?),(.*)$";
$file = file($url);
foreach ($file as $line) {
$line = rtrim($line);
if(preg_match("/(\w+) (\d{1}), (\d{1}), (\d{1}), (\d{4})/",$line)){
$version = preg_replace("/(\d{1}), (\d{1}), (\d{1}), (\d{4})/","\\1.\\2.\\3.\\4",$line)."\n";
}
if (preg_match("#$regex#i", $line, $regs)) {
$exp = str_replace(' ', '',preg_replace("#$I#i", "\\0", $regs***91;3***93;));
// разраничиваем '_END'-поля пустой строкой
$emptyline = (strpos($regs***91;1***93;,'_END')===false)? "" : "\n";
$line = "\t'{$regs***91;1***93;}' => ".$exp.","/*.$regs***91;4***93;*/;
$output .= $line."\n".$emptyline;
$line2 = "\t$exp => '$regs***91;1***93;',";
$output2 .= $line2."\n".$emptyline;
}
}
$output = $version."\$field = array(\n$output);\n\n\$fieldName = array(\n$output2);";
}
а потом просто:
PHP код:
function getListFiles($dir='input/') {
// Открыть заведомо существующий каталог и начать считывать его содержимое
if (is_dir($dir)) {
if ($dh = opendir($dir)) {
while ($file = readdir($dh)) {
if(strlen($file)>4) {
$ect = explode(".",$file);
if($ect***91;4***93;=="h")
$filesList***91;***93; = $file;
}
}
closedir($dh);
}
}
return $filesList;
}
$filesList = getListFiles();
if(empty($filesList))
exit("dir is empty");
foreach($filesList AS $file){
fields_defines($data,'input/'.$file);
$fw = fopen('defines/'.str_replace('.h','.php',$file),'wb');
fwrite($fw,"<?php $data ?>");
fclose($fw);
fields_arrays($data,'input/'.$file);
$fw = fopen('arrays/'.str_replace('.h','.php',$file),'wb');
fwrite($fw,"<?php $data ?>");
fclose($fw);
print "обработан input/$file\n";
}
в папке "input" - файлы UpdateFields.h для различных версий
в папке "defines" будут распарсенные поля в виде констант
в папке "arrays" будут распарсенные поля в виде массива
|