есть строки Код (Text): 'template' : "/goodsViev.htm", 'show' : "yes" Код (Text): 'template': '/listGoods.htm' Код (Text): "orderBy":'rank' нужно их преобразовать к массиву. Как видно кавычки могут быть разные, отступы тоже. Хелп плизз.
допоможiть! Сейчас написал вот так: PHP: <? private static function unparseSettings($settings) { $pattern = '#(\'|")(.*?)("|\')#si'; preg_match_all($pattern, $settings, $matches); $keys = $vals = array(NULL); foreach ($matches[2] as $k => $v) { if($k % 2 == 0) $keys[] = $v; else $vals[] = $v; } return array_combine($keys, $vals); } но это же калл.
Никогда не работал с форматом JSON, но что если попробовать preg_split по элементу разделителя , , которая не находится в двойных кавычках и является предшествующей следующей инструкции. Далее получаем обычную строку со значением инсекс -> значение и забиваем её в массив. Но, поскольку спецификацию JSON я не знаю и сужу только по тому, что вижу, возможно вариант мой неверный.
Весь вопрос в том, могут ли в середине кавычек встречаться другие кавычки? Т.е. например такое: 'show' : "yes 'yes' no" Если такого не бывает, то: 1. Все двойные кавычки меняем на одинарные 2. Убираем все пробельные символы по обе стороны от двоеточия 3. Парсим простой регуляркой - точно не скажу, не тестил '/\'(.+)\'\:\'(.+)\'/' как-то так. а если внутри кавычек могут втречаться другие кавычки... то тогда вычисли нужное (разделяющие) двоеточие, тупо разбей строку по этому символу и каждую из полученных обработай - удали пробельные и сними кавычки.
Apple та это у меня не совсем JSON, но похоже. json_decode не подходит, так как у меня невесть где пробельные символы находятся, кавычки разные и еще много чего. Cron я еще не знаю, наверно не будет кавычек в кавычках. Кстати я тоже думал разбить по ,, потом по : и снять кавычки. Но пока в сторону регулярки думаю. зызы: а как думаете, что это такое будет в итоге?
PHP: <?php $data = array(); $json = file_get_contents('json.txt'); // твой файл с текстом выше /** * Разбиваем строку */ $json = preg_split('/["\'],\s*\r?\n/im', $json); /** * Разбираем полученный массив по примеру ключ => значение * и пишем в массив $data */ foreach($json as $exp){ $tmp = preg_split('/(?<=["\'])\s*:\s*(?=["\'])/is', $exp); $tmp[0] = preg_replace('/^["\']*(.*?)["\']*$/is', '$1', $tmp[0]); $tmp[1] = preg_replace('/^["\']*(.*?)["\']*$/is', '$1', $tmp[1]); $data[$tmp[0]] = $tmp[1]; } /** * Выводим пример */ echo $data['template']; ?> Следует отметить, что разбивает файл правильно, вне зависимости от типа кавычек и уровня их вложенности. Тестировал, всё вроде работает.
Забыл приложить файл json.txt Код (Text): 'template' : "/goodsViev.htm", 'show' : "yes", "orderBy" :'rank'
Apple оу, спасибо, но у меня чуточку некорректно работает скармливаю Код (Text): 'someCV_var' : "ss", "aaa" :"aa" получаю Код (Text): Array ( [ 'someCV_var] => ss [ "aaa] => aa" ) скармливаю Код (Text): "e1a" : "info:3" получаю Код (Text): Array ( [ "e1a] => info:3" То есть время от времени проскакивают лишние символы кавычек - в начале ключа элемента массива/в конце значения
а ещё можно так PHP: <? $str=preg_replace("#(?<=[\"\'])\s*:\s*(?=[\"\'])#is","=>",$str); eval("\$result=array(".$str.");"); ?>
А, так там пробелы начальные нефиксированные. Ну ничего, переписал: PHP: <?php $data = array(); $json = file_get_contents('json.txt'); /** * Разбиваем строку */ $json = preg_split('/["\'],\s*\r?\n/im', $json); /** * Разбираем полученный массив по примеру ключ => значение * и пишем в массив $data */ foreach($json as $exp){ $tmp = preg_split('/(?<=["\'])\s*:\s*(?=["\'])/is', $exp); $tmp[0] = preg_replace('/^["\']*(.*?)["\']*$/is', '$1', trim($tmp[0])); $tmp[1] = preg_replace('/^["\']*(.*?)["\']*$/is', '$1', trim($tmp[1])); $data[$tmp[0]] = $tmp[1]; } /** * Выводим пример */ echo '<pre>'; print_r($data); ?> Теперь работает, включая кавычки
ага, большое спасибо, Apple я тоже поправил, вроде работает: PHP: <? $json = preg_split('/["\'],\s*(\r|\n|)/im', $settings); // Так более корректно, ибо после запятой может отсутствовать перенос коретки: 'var1':'foo',"var2": 'bar' foreach ($json as $exp) { $tmp = preg_split('/(?<=["\'])\s*:\s*(?=["\'])/is', $exp); $data[trim($tmp[0], "\n\t\r'\"")] = trim($tmp[1], "\n\t\r'\""); } return $data; Mr.M.I.T. json_decode не подходит и я уже объяснил поцчему, пздц, ты хоть бы тред прочитал прежде чем писать. А eval не есть гуд.
Koc Твой код вложенные кавычки режет, вот поэтому я так не хотел писать Но, впрочем, тебе лучше знать спецификацию данных и требования к строкам. ev[a=i]l
окончательный вариант: PHP: <? private static function unparseSettings($settings) { // разбиение построчно $json = preg_split('/["\'],\s*(\r|\n|)/im', $settings); foreach ($json as $exp) { // Разбиение поэлементно и обрезка лишних пробельных символов $tmp = array_map('trim', preg_split('/(?<=["\'])\s*:\s*(?=["\'])/is', $exp)); $pattern = '#^["\']*(.*?)["\']*$#is'; // обрезка кавычек по бокам $tmp[0] = preg_replace($pattern, '$1', $tmp[0]); $tmp[1] = preg_replace($pattern, '$1', $tmp[1]); $data[$tmp[0]] = $tmp[1]; } return $data; } и это будет надстройка к шаблонизатору, для того, что бы из шаблонов можно было вызывать объекты
проще подогнать под JSON формат и заюзать json_decode пробелы не имеют значения, кавычки можно заменить. PHP: <? $result = (array) json_decode('{ "template" : "/goodsViev.htm", "show" : "yes" }');
Ti тю, а я думал, что пробелы имеют значение, особенно учитывая тот факт, что ребята в комментах к этой ф-ции пишут свои ф-ции, с урезанием пробелов. Ну да черт с этим json_decode, Cherry предложил ваще офигеннейшую регулярку. PHP: <? private static function unparseSettings($settings) { preg_match_all("#(\'|\")(.*)\\1\s*:\s*(\'|\")(.*)\\3#U", $settings, $matches); return (sizeof($matches[2])) ? array_combine($matches[2], $matches[4]) : array(); }