2009-11-06 5 views
2

Мне нужно PHP Regex, которое может анализировать файлы .strings. В частности, он должен иметь возможность обрабатывать комментарии, пустые строки, экранированные символы и угловые скобки.Regex для синтаксического анализа файлов .strings

Пример файла .strings:

/* string one */ 
"StringOne"="\"1\""; 

"StringTwo"="<2>"; 

/* Bob Dillon */ 
"Bob"="Dillon"; 

По желанию, желаемый результат будет что-то типа:

Array ([StringOne] => "\" 1 \ "" [StringTwo ] => "< 2>" [Bob] => "Dillon")

Вся помощь будет принята с благодарностью!

+0

Я не уверен, что вы хотите в качестве результата – NDM

+2

send-me-the-codez – Amarghosh

+0

Является ли файл .strings Regular? Если нет, вам нужен полный парсер, а не просто регулярное выражение. –

ответ

4

это?

$r = ' 
    /* string one */ 
    "StringOne"="first \"string\""; 

    "StringTwo"="2"; 

    /* Bob Dillon */ 
    "Bob"="Dillon"; 
    '; 

    preg_match_all('~^\s*"((?:\\\\.|[^"])*)"[^"]+"((?:\\\\.|[^"])*)"~m', 
     $r, $matches, PREG_SET_ORDER); 
    $parsed = array(); 
    foreach($matches as $m) 
     $parsed[$m[1]] = $m[2]; 

    print_r($parsed); 

печатает

Array ( 
[StringOne] => first "string" 
[StringTwo] => 2 
[Bob] => Dillon 
) 
+0

Это не относится к скобкам или экранированным символам (см. Обновленный вопрос). Ближе, чем я, хотя! – hammerdr

+0

Извините, я оговорился. Он * делает * обрабатывает угловые скобки, но НЕ обрабатывает скошенные скобки. – hammerdr

+0

Обновлен вопрос, чтобы предоставить пример вывода. – hammerdr

0

В то время как я использую PHP скрипт, а я бег это на Mac, так что я думал, что я мог расшевелить приложение командной строки какао, чтобы сделать .strings разбора так или иначе. Что я и сделал.

Код ниже представляет собой утилиту командной строки, которая принимает параметр имени файла (файл строк) и выплескивает содержимое этого файла строк как json (to stdout).

#import <Foundation/Foundation.h> 

#import "NSDictionary+BVJSONString.h" // from http://stackoverflow.com/a/20262259/129202 

#define ERRORCODE (1) 

int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool { 

     // insert code here... 
     //NSLog(@"Hello, World!, argc: %d", argc); 

     if (argc != 2) { 
      NSLog(@"Specify file argument!"); 
      return ERRORCODE; 
     } 

     NSString* filepath = [NSString stringWithCString:argv[1] encoding:NSASCIIStringEncoding]; 

     NSError* error = nil; 

     NSStringEncoding usedencoding; 
     NSString* strings = [NSString stringWithContentsOfFile:filepath usedEncoding:&usedencoding error:&error]; 
     if (error) { 
      NSLog(@"Error: %@", error); 
      return ERRORCODE; 
     } 
     NSDictionary* dict = [strings propertyList]; 
     NSString* json = [dict bv_jsonStringWithPrettyPrint:NO]; 

     [json writeToFile:@"/dev/stdout" atomically:NO encoding:NSUTF8StringEncoding error:nil]; 
    } 
    return 0; 
} 

Это немного грубо - это лучше читать из стандартного ввода или что-то - я не очень привык писать эти вещи, так что не стесняйтесь, чтобы улучшить. Обратите внимание, что это использует собственный код анализа синтаксиса .strings, поэтому он должен быть лучше, чем большинство регулярных выражений.

Смежные вопросы