Ru-MaNGOS

Вернуться   Ru-MaNGOS > Дополнения > WWW

Важная информация

WWW Web интерфейс для MaNGOS

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 14.03.2010, 01:10   #1
Gerald
Новичок
 
Регистрация: 07.03.2010
Сообщений: 21
Сказал(а) спасибо: 99
Поблагодарили 35 раз(а) в 6 сообщениях
Gerald На верном пути
По умолчанию [UpdateFields.h] Пример парсинга

mangos.ru
дата:18 июля 2009 г.
автор:Feuer


По просьбам трудящихся Пример парсинга UpdateFields.h, экспорт данных о полях в ini файл и работа с ним.


PHP код:
<?php
/**
 * UpdateFields.php :: Parse UpdateFields.h 
 *
 * @author Dibosh
 */

class UpdateFields {

static public function 
update(){

    
$file file_get_contents(UPDATE.'UpdateFields.h') or die();
    
$file preg_replace('/(\/.*\n)|\t|\s|\n/Uis','',$file);
                    
#enumEObjectFields{ =>
    
preg_match_all('/enumE(.*?)\;/i',$file,$Fields);
                    
# => ObjectFields
    
foreach($Fields***91;1***93; as $field){
      
      
preg_match('/^(.*){/i',$field,$name);
      
$name $name***91;1***93;;

     
preg_match('/{(.*?),}/i',$field,$field);
     
$field split(','$field***91;1***93;);
     foreach(
$field as $f){
            
preg_match('/^(.*?)=.*(0x.{4})/i',$f,$s);
            
$F_array***91;$name***93;***91;$s***91;1***93;***93; = hexdec($s***91;2***93;);
            }

        }
    
INI::save(CONFIG.'DataFields'$F_array);
}


}
?>


PHP код:
<?php
/**
 * ini.php :: Класс для работы с .ini файлами конфигурации
 *
 * @author Dibosh
 */

class INI {

public static function 
save($fname,$array){

        
$f_ini fopen($fname.'.ini','w') or die("can't open");
        foreach(
$array as $part_key => $part_cont){

            
fwrite ($f_ini,"***91;".$part_key."***93;\n") or die();
                foreach(
$part_cont as $key => $value){

                        
fwrite ($f_ini,$key."=".$value."\n") or die();

                    }
            }

        
fclose($f_ini) or die();
        }

public static function 
load($fname){
            return 
parse_ini_file($fname.'.ini',1);
        }
}
?>
PHP код:
<?php
/**
 * index.php
 *
 * @author Dibosh
 */

define(UPDATE,"./update/");
define(CONFIG,"./config/");

include(
'UpdateFields.php');
include(
'ini.php');

UpdateFields::Update();

$F_array INI::load(CONFIG.'DataFields');

print 
"<ul>";
foreach(
$F_array as $part => $items){
    print 
"<li>".$part."</li>";
    print 
"<ul>";
    foreach(
$items as $key => $num){
        print 
"<li>".$key." = ".$num."</li>";
        }
    print 
"</ul>";
}
print 
"</ul>";

# пример использования
print $F_array***91;'ItemFields'***93;***91;'ITEM_FIELD_CREATOR'***93;;
# узнаем позицию для ITEM_FIELD_CREATOR

//дальнейший код не тестировался

$db = new PDO('#параметры');

$st $db->prepare("UPDATE `table` SET `data`=CONCAT(CAST(SUBSTRING_INDEX(`data`, ' ', ?) AS CHAR), ' ', ?, ' ',
CAST(SUBSTRING_INDEX(`data`, ' ', -(? - ?))AS CHAR)) WHERE `guid` = ?"
);

$part   'ItemFields';
$key    'ITEM_FIELD_CREATOR';
$value  '777';
$guid   '10';

$st->execute(array($F_array***91;$part***93;***91;$key***93;,$value,count($F_array***91;$part***93;),$F_array***91;$part***93;***91;$key***93;),$guid);


?>
Gerald вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
Konctantin (14.03.2010), Shadez (14.03.2010)
Старый 14.03.2010, 01:13   #2
Gerald
Новичок
 
Регистрация: 07.03.2010
Сообщений: 21
Сказал(а) спасибо: 99
Поблагодарили 35 раз(а) в 6 сообщениях
Gerald На верном пути
По умолчанию этаже тема

этаже тема
автор: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" будут распарсенные поля в виде массива
Gerald вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Shadez (14.03.2010)
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обновление БД(пример) DeusModus Новичкам 7 30.07.2010 13:26


Текущее время: 13:05. Часовой пояс GMT +3.


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot