преобразование формата файла .string в формат php-массива

Надеюсь, что вы делаете файл

Итак, вот мой вопрос: у меня есть файл xyz.string, который используется для перевода. Пожалуйста, найдите небольшую часть файла ниже.

/* name for an item that is duplicated in the UI, based on the original name */ "%@ (Copy)" = "%@ (kopi)"; /* display name for a book page template that is the first page of that section */ "%@ (First)" = "%@ (Første)"; /* display name for a book page template that represents a hardcover cover. the second argument is the cover type. */ "%@ (Hardcover, %@)" = "%1$@ (Hard innbinding, %2$@)"; /* display name for a book page template that represents a softcover cover. the second argument is the cover type. */ "%@ (Softcover, %@)" = "%1$@ (myk innbinding, %2$@)"; 

Я хочу преобразовать перевод, т. е. в php-массив, например

 array( array{ "%@ (First)"=>"%@ (Første)" }, array { "@ (Hardcover, %@)"=>"%1$@ (Hard innbinding, %2$@)" } ) 

и т. д. Формат, который указан, не является обязательным, но это должно быть то, с чем я могу обойтись.

Ниже приведена спецификация формата файла

  • пары ключ-значение разделяются символом равенства (=) и заканчиваются точкой с запятой (;).

  • ключи и значения окружены двойными кавычками (")

  • вид place-holder может быть:% .2f,% d,% 1 $ s (регулярное выражение для заполнителей: /% [\ d |.] \ $ \ d * [dsf] {1} \ b + /)

  • комментарии начинаются в начале строки и охватывают всю строку или несколько строк

  • однострочные комментарии начинаются с двойных слэшей (//) многострочные комментарии заключены в / * * /

  • комментарий присваивается следующей паре ключ-значение, если между пустыми линиями нет

Я знаю, что это может быть достигнуто с помощью PREG_MATCH_ALL, но я не могу создать приятное регулярное выражение

ниже мой код

 $str=file_get_contents($_FILES['string']['tmp_name']); preg_match_all("|(\".+\"\;)|s",preg_quote($str),$match); echo "<pre/>";print_r($match);die; 

точная строка, которую я получаю после file_get_content, следующая

 /* name for an item that is duplicated in the UI, based on the original name */ "%@ (Copy)" = "%@ (kopi)"; /* display name for a book page template that is the first page of that section */ "%@ (First)" = "%@ (Første)"; /* display name for a book page template that represents a hardcover cover. the second argument is the cover type. */ "%@ (Hardcover, %@)" = "%1$@ (Hard innbinding, %2$@)"; 

Если кто-нибудь может мне помочь в этом, он будет очень признателен

Спасибо, Райан

Господь, Регулярное выражение:

 "([^"]+)"\s*=\s*"([^"]+)"; 

Объяснения :

 "([^"]+)" # Every thing between double quotes \s*=\s* # Equal sign preceded or followed by any number of spaces "([^"]+)"; # Again every thing between double quotes that ends to a ; 

PHP-код:

 $text = file_get_contents($_FILES['string']['tmp_name']); preg_match_all('#"([^"]+)"\s*=\s*"([^"]+)";#', $text, $match); $translate = array_combine($match[1], $match[2]); print_r($translate); 

Результатом для вашего образца текста будет:

 Array ( [%@ (Copy)] => %@ (kopi) [%@ (First)] => %@ (Første) [%@ (Hardcover, %@)] => %1$@ (Hard innbinding, %2$@) [%@ (Softcover, %@)] => %1$@ (myk innbinding, %2$@) ) 

Вы можете просто прочитать строку wohle, а затем использовать: explode

 $array = explode(';', $string);