Всем доброго дня! В ответ на Get запрос сервер мне присылает код: HTML: .....{\"id\":\"Aw4Cgww=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":12,\"ox\":194,\"oy\":355},\"AwgCkAI=\":{\"id\":\"AwgCkAI=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":2,\"ox\":325,\"oy\":79},\"Aw4CgwQ=\":{\"id\":\"Aw4CgwQ=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":4,\"ox\":814,\"oy\":221},\"Aw4CgwM=\":{\"id\":\"Aw4CgwM=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":3,\"ox\":748,\"oy\":153},\"AwgCkAs=\":{\"id\":\"AwgCkAs=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":11,\"ox\":789,\"oy\":326},\"AwgCkAU=\":{\"id\":\"AwgCkAU=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":5,\"ox\":536,\"oy\":122},\"AwgCkBE=\":{\"id\":\"AwgCkBE=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":17,\"ox\":275,\"oy\":373},\"AwgCkA0=\":{\"id\":\"AwgCkA0=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":13,\"ox\":650,\"oy\":393},\"Aw4CgwA=\":{\"id\":\"Aw4CgwA=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":0,\"ox\":553,\"oy\":137},\"AwgCkAY=\":{\"id\":\"AwgCkAY=\",\"type\":\"free\",\"x\":776,\"y\":656,\"nr\":6,\"ox\":638,\"oy\":125},\"Aw4Cgw0=\":{\"id\":\"Aw4Cgw0=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":13,\"ox\":128,\"oy\":288},\"Aw4CgxM=\":{\"id\":\"Aw4CgxM=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":19,\"ox\":259,\"oy\":200},\"Aw4CgxA=\":{\"id\":\"Aw4CgxA=\",\"type\":\"free\",\"x\":782,\"y\":643,\"nr\":16,\"ox\":332,\"oy\":106},\"37\":{\"id\":18394,\"name\":\"<red>\\u0413\\u0430\\u0432\\u0438\\u0444\</red>",\"dir\":\"n\",\"expansion_stage\":2,\"x\":782,\"y\":643,\"ox\":211,\"oy\":180,\"offer\":\"iron\",\"demand\":\"stone\"},\"38\":{\"id\":18395,\"name\":\"\\u0413\\u0430\\u0432\\u0440\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":1,\"x\":782,\"y\":643,\"ox\":397,\"oy\":392,\"offer\":\"wood\",\"demand\":\"stone\"},\"39\":{\"id\":18397,\"name\":\"\\u042d\\u0434\\u043e\",\"dir\":\"n\",\"expansion_stage\":2,\"x\":782,\"y\":643,\"ox\":399,\"oy\":325,\"offer\":\"stone\",\"demand\":\"wood\"},\"40\":{\"id\":18398,\"name\":\"\\u0425\\u0438\\u043a\\u0438\\u0440\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":782,\"y\":643,\"ox\":258,\"oy\":325,\"offer\":\"wood\",\"demand\":\"stone\"},\"41\":{\"id\":18400,\"name\":\"\\u041a\\u043e\\u0443\\u0441\\u0444\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":782,\"y\":643,\"ox\":738,\"oy\":236,\"offer\":\"stone\",\"demand\":\"wood\"},\"42\":{\"id\":18545,\"name\":\"\\u041d\\u044d\\u0439\\u044d\\u0433\\u0430\",\"dir\":\"n\",\"expansion_stage\":1,\"x\":776,\"y\":656,\"ox\":536,\"oy\":361,\"offer\":\"wood\",\"demand\":\"stone\"},\"43\":{\"id\":18547,\"name\":\"\\u041a\\u0438\\u0440\\u043e\\u0441\\u0444\\u043e\\u0441\\u043a\\u043e\",\"dir\":\"n\",\"expansion_stage\":1,\"x\":776,\"y\":656,\"ox\":686,\"oy\":336,\"offer\":\"stone\",\"demand\":\"wood\"},\"44\":{\"id\":18548,\"name\":\"\\u041a\\u043e\\u0443\\u0441\\u0440\\u043e\\u0441\\u0442\\u0430\\u0444\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":4,\"x\":776,\"y\":656,\"ox\":576,\"oy\":175,\"offer\":\"iron\",\"demand\":\"wood\"},\"45\":{\"id\":18549,\"name\":\"\\u0413\\u0430\\u0432\\u0441\\u0442\\u0440\\u0430\\u0439\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":776,\"y\":656,\"ox\":363,\"oy\":336,\"offer\":\"wood\",\"demand\":\"stone\"},.... Код очень большой, поэтому выложил кусочек... Как мне ПРАВИЛЬНО спарсить "id и "name? Может воспользоваться какой-нибудь библиотекой или все-таки регуляркой??? Посоветуйте что почитать, где искать?
Читать про Json как прочтешь поймешь что тебе вообще нечего не надо парсить, а всего лишь серилозоватиь json данные в обект\массив, и нужное взять по индексу, json_decode, json_encode.
Не получается декодировать Json... Синтаксическая ошибка, не корректный JSON Как такое может быть? Если этот Json мне сервер отсылает? Пожалуйста помогите разобраться PHP: <?php header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0", false); header("Content-Type: text/html; charset=utf-8"); header("Pragma: no-cache"); error_reporting( E_ALL ); $url = 'http://ru.grepolis.com'; $urlTo_start_page = 'http://ru.grepolis.com/start/index?action=login_from_start_page'; $urlTo_start_page_next = 'http://ru.grepolis.com/start/index?action=fetch_news'; $urlTo_login_to_game = 'http://ru.grepolis.com/start?action=login_to_game_world'; $name = 'Tartang'; // Логин $password = '7TXzMQvUZt3qUqh'; // Пароль define('ROOT', dirname(__FILE__).'/'); $cookie_filename = ROOT . uniqid(md5(time()), true).'.tmp'; // Настройка курла $curl = curl_init(); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_TIMEOUT, 30 ); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.0; en; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1'); curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename); curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 1); curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_REFERER, 'http://google.com' ); curl_setopt($curl, CURLOPT_URL, $url); $html = curl_exec($curl); // Запускаем курл, что бы получить куки $post = 'json={"name":"' . $name . '","password":"' . $password . '","passwordhash":"","autologin":false}'; curl_setopt($curl, CURLOPT_URL, $urlTo_start_page); curl_setopt($curl, CURLOPT_REFERER, $url ); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $post); $html = curl_exec($curl); $post = 'json={}'; curl_setopt($curl, CURLOPT_URL, $urlTo_start_page_next); curl_setopt($curl, CURLOPT_REFERER, $urlTo_start_page ); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $post); $html = curl_exec($curl); $post = 'world=ru11&facebook_session=&facebook_login=&gift_key=portal_sid=name=' . $name . '&password=' . $password; curl_setopt($curl, CURLOPT_URL, $urlTo_login_to_game ); curl_setopt($curl, CURLOPT_REFERER, $urlTo_start_page_next ); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, $post); $html = curl_exec($curl); preg_match("#Game\.csrfToken = '(\S+)'#", $html, $token); //print $token[1]; $time = explode(' ', microtime()); $timef = $time[1] . substr($time[0], 2, 3); //print $timef; //print $token[1]; // Проверка Json $json[] = $html; foreach ($json as $string) { echo 'Декодируем: ' . $string; json_decode($string); switch (json_last_error()) { case JSON_ERROR_NONE: echo ' - Ошибок нет'; break; case JSON_ERROR_DEPTH: echo ' - Достигнута максимальная глубина стека'; break; case JSON_ERROR_STATE_MISMATCH: echo ' - Некорректные разряды или не совпадение режимов'; break; case JSON_ERROR_CTRL_CHAR: echo ' - Некорректный управляющий символ'; break; case JSON_ERROR_SYNTAX: echo ' - Синтаксическая ошибка, не корректный JSON'; break; case JSON_ERROR_UTF8: echo ' - Некорректные символы UTF-8, возможно неверная кодировка'; break; default: echo ' - Неизвестная ошибка'; break; } echo PHP_EOL; } curl_close($curl); // Завершаем сеанс ?>
Видимо дело не только в синтаксисе Json В коде встречаются и такие куски: PHP: {\"x\":795,\"y\":657,\"id\":195964,\"type\":52,\"res\":\"Iw\",\"neighbours\":[\"52298380\",\"51708558\",\"52167317\"]}],\"wonders\":[],\"presents\":[]}],\"night\":false}\t);\n\n\tMapDuration.duration_offset = 900;\n\tMapDuration.naval_speed_bonus_factor = 1;\n\tHolidays.init([]);\n }\n\/\/]]>\n<\/script>\n\n<div id=\"map_wrapper\">\n\t<div id=\"map\">\n\t\t<div id=\"map_move_container\" style=\"position:absolute; top:0px; left:0px; z-index:1;\">\n\t\t\t<div id=\"map_tiles\" style=\"position:absolute; top:0px; left:0px; z-index:1;\"><\/div>\n\t\t\t<div id=\"map_islands\" style=\"position:absolute; top:0px; left:0px; z-index:4;\"><\/div>\n\t\t\t<div id=\"map_towns\" style=\"position:absolute; top:0px; left:0px; z-index:5;\">\n\t\t\t\t<a id=\"towndummy\" class=\"tile nw lvl3\"><\/a>\n\t\t\t<\/div>\n\t\t\t<div id=\"map_wonders\" style=\"position:absolute; top:0px; left:0px; z-index:4;\">\n\t\t\t\t<a id=\"wonderdummy\" class=\"tile empty\"><\/a>\n\t\t\t<\/div>\n\t\t\t<div id=\"map_presents\" style=\"position:absolute; top:0px; left:0px; z-index:4;\"><\/div>\n\t\t\t<div id=\"map_night\"><\/div>\n\t\t\t<div id=\"mouse_coordinate_popup\" style=\"display:none;\">\n\t\t\t\t<div id=\"town_direction_wrapper\">\n\t\t\t\t\t<div id=\"town_direction\"><\/div>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<\/div>\n\t<\/div>\n<\/div>\n\n\n\n<div id=\"minimap_canvas\">\n\t<div id=\"minimap\">\n\t\t<div id=\"minimap_islands_layer\">\n\t\t<\/div>\n\t<\/div>\n\t<div id=\"minimap_click_layer\"><\/div>\n<\/div>","mtime":1342194349},"bar":{"data":{"current_god_favor_production":0,"production":{"wood":51,"stone":37,"iron":37},"resources":{"wood":3322,"stone":2182,"iron":4626},"storage":6241,"resources_contraints":{"plenty" А можно как-нибудь вычленить именно Json???
Ребята, сам не разберусь... Помогите плиз! Вложение полный код, который присылает мне сервер... http://narod.ru/disk/56515222001.d06c63ea8...2/Json.doc.html Я пометил нужный блок красным цветом, в нем мне нужно выбрать значения "id" и "name"... Может как-то в несколько этапов парсить? Помогите пожалуйста... Топчусь на месте...
можешь регулярку запилить. первую по буквам id . до первой запятой. и потом числа второй регуляркой выбрать. name каким нить таким же макаром( я его не смотрел) . но вообще разберись лучше в json . так как регулярка в этом случае это решение на "отстань"
Думаю регуляркой Json вычленить (тока не знаю как), а потом бы уже json_decode... Помогите выдернуть Json плиз...
не не. тут либо одно либо другое. ну что то типа /^id\":[0-9]*$/ должно вернуть тебе id\":195964 . и потом 0-9 чисто числа. или a-zA-Z0-9 и числа и буквы. это id . как то так же name. гугли регулярки если хочешь так. или посмотри как в javascript eval применяют к json. там еще одну скобку добавляют. добавь и ты и все будет гуд наверное. но вообще я тебе скажу что работать в json я бы тебе не советовал. я не то что гуру в нер. но фиг его знает что они туда засунули. а ты decode делаешь . повторюсь не сильно я спец в этом. но хорошо если там php массив лежал . а если там какая нить коллекция или что нить еще чего php в принципе не понимает. кста именно поэтому у тебя может быть ошибка. что твой php не понимает что там лежит . так что все же делай регулярку. json это для удобной работы javascript а не для php. так что я все же склонен тебе советовать регулярку в итоге
PHP: preg_match_all('|id":([0-9]+),"name":"([^"]+)|i',str_replace('u0','\u0',stripcslashes($html)),$out); for($i=0;$i<count($out[1]); $i++){ echo $out[1][$i].' - '.$out[2][$i].'<br/>'; } вместо своего json поставь на выходе такое
Bars, спасибо огромное! Плюсик поставил... Я только сейчас догнал... Можно как-нибудь добавить в твою регулярку поиск relation_status и его значение... В общем в этом коде есть 8 элементов с relation_status, вот мне и нужны значения "Id" "name" и "relation_status" этих 8 строчек... Блин, никак не могу освоить регулярки... Кучу литературы перечитал, без практики трудно, начинаю понимать только после того, как кто-нибудь пример приведет...
PHP: preg_match_all('|id":([0-9]+),"name":"([^"]+)([^}]+)|i',str_replace('u0','\u0',stripcslashes($html)),$out); for($i=0;$i<count($out[1]); $i++){ $status=''; preg_match('|relation_status":([0-9]),|i',stripcslashes($out[3][$i]),$status); if($status[1]!=''){ $stat=' - '.$status[1]; } echo $out[1][$i].' - '.$out[2][$i].$stat.'<br/>'; } в эту регулярку пихать не стал, создал вторую, которая на выходе первой осуществляет поиск на наличие relation_status если находит то забивает ее в $status[1] ну и проверка есть $status[1] не пуста то допишем кусочек кода (и кодом назвать то сложно).. доведи до ума. я не умелец писать код красиво с 0. я пишу - потом переписываю =))) на выходе такое конструктор регулярок http://www.pcre.ru/eval/ забей в закладки - тема!
если в первом моем примере резулярку изменить на PHP: preg_match_all('|id":([0-9]+),"name":"([^"]+)(.*)relation_status":([0-9]),|i',str_replace('u0','\u0',stripcslashes($html)) ,$out); то в $out[4][$i] будет relation_status, то тогда будут выведены не все строчки, а только те, в которых присутствует relation_status
Спасибо, именно то, что нужно!!! Когда я уже разберусь в этих регулярках... ((( Блин, дела же так, только вместо "*" - "+" ставил...
Что-то опять не так... PHP: preg_match_all('|id":([0-9]+),"name":"([^"]+)(.*)relation_status":([0-9]),|i',str_replace('u0','\u0',stripcslashes($html)), $out); for($i=0;$i<count($out[1]); $i++){ echo $out[1][$i].' - '.$out[2][$i].' - '.$out[4][$i].'<br/>'; } Выводит: 52646 - MEN - 0 Всего одну строчку (а должен 8)... И в этой строке вообще нет relation_status
не проверял.. хотя по идеи [0-9]),|i на [0-9]),|Ui должно сработать... лень мне уже... у меня уже пол двенадцатого ночи.. вот так сделай если тоже лень PHP: preg_match_all('|id":([0-9]+),"name":"([^"]+)([^}]+)|i',str_replace('u0','\u0',stripcslashes($html)),$out); for($i=0;$i<count($out[1]); $i++){ $status=''; preg_match('|relation_status":([0-9]),|i',stripcslashes($out[3][$i]),$status); if($status[1]!=''){ echo $out[1][$i].' - '.$out[2][$i].' - '.$status[1].'<br/>'; } } но лучше все же сделать нормальную регулярку.. скрипт быстрей отработает и меньше будет
Значения ID и Name удается выдернуть... Но мне нужно, чтобы еще и значение relation_status выдергивалось... Только вот то, что находится между Name и relation_status может меняться... Как заменить изменяемые символы и не включать их в массив? Пробовал (.*), но на выходе такая билеберда... В общем как из этого выбрать только Id name и relation_status, а все остальное исключить? PHP: "55":{"id":19410,"name":"\u0413\u0430\u0433\u0430\u0432\u0442\u0430\u044d","dir":"n","expansion_stage":3,"x":788,"y":648,"ox":472,"oy":147,"offer":"wood","demand":"stone","mood":100,"relation_status":1,"ratio":1.25,"loot":1342460846,"lootable_human":"16.07.12 \u0432 21:47","looted":1342460546},
В общем мне нужно из ответа сервера (выкладываю .txt, так как код оч. длинный): http://phpforum.ru/html/counter/counter.php?link=http://narod.ru/disk/56802785001.cc91b1bbc74fad759f9fff44c6a3f059/Json.txt.html Выбрать это: PHP: "54\":{\"id\":19409,\"name\":\"\\u0420\\u043e\\u0441\\u043d\\u043e\\u0441\\u043a\\u043e\\u043d\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":629,\"oy\":170,\"offer\":\"stone\",\"demand\":\"wood\",\"mood\":100,\"relation_status\":1,\"ratio\":1.25,\"loot\":1342173457,\"lootable_human\":\"13.07.12 \\u0432 13:57\",\"looted\":1342173157},\"55\":{\"id\":19410,\"name\":\"\\u0413\\u0430\\u0433\\u0430\\u0432\\u0442\\u0430\\u044d\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":472,\"oy\":147,\"offer\":\"wood\",\"demand\":\"stone\",\"mood\":100,\"relation_status\":1,\"ratio\":1.25,\"loot\":1342460846,\"lootable_human\":\"16.07.12 \\u0432 21:47\",\"looted\":1342460546},\"56\":{\"id\":19411,\"name\":\"\\u041a\\u043e\\u0433\\u0430\\u0445\\u0438\\u0434\\u0440\\u044d\\u0439\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":680,\"oy\":234,\"offer\":\"stone\",\"demand\":\"wood\",\"mood\":100,\"relation_status\":0,\"ratio\":1.25},\"57\":{\"id\":19412,\"name\":\"\\u0422\\u0430\\u0445\\u0438\\u0433\\u0430\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":694,\"oy\":296,\"offer\":\"stone\",\"demand\":\"wood\",\"mood\":100,\"relation_status\":0,\"ratio\":1.25},\"58\":{\"id\":19413,\"name\":\"\\u0420\\u043e\\u0442\\u0430\\u0440\\u043e\\u0441\\u044d\",\"dir\":\"n\",\"expansion_stage\":4,\"x\":788,\"y\":648,\"ox\":278,\"oy\":208,\"offer\":\"stone\",\"demand\":\"iron\",\"mood\":100,\"relation_status\":1,\"ratio\":1.25,\"loot\":1342460843,\"lootable_human\":\"16.07.12 \\u0432 21:47\",\"looted\":1342460543},\"59\":{\"id\":19414,\"name\":\"\\u0414\\u043e\\u043d\\u043e\\u0441\\u0433\\u0430\\u0444\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":228,\"oy\":265,\"offer\":\"wood\",\"demand\":\"iron\",\"mood\":100,\"relation_status\":1,\"ratio\":1.25,\"loot\":1342173456,\"lootable_human\":\"13.07.12 \\u0432 13:57\",\"looted\":1342173156},\"60\":{\"id\":19415,\"name\":\"\\u041d\\u044d\\u0439\\u0440\\u043e\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":589,\"oy\":365,\"offer\":\"iron\",\"demand\":\"wood\",\"mood\":100,\"relation_status\":0,\"ratio\":1.25},\"61\":{\"id\":19416,\"name\":\"\\u0421\\u0442\\u0440\\u0430\\u0439\\u043d\\u043e\\u0441\\u043a\\u043e\\u0443\\u0441\",\"dir\":\"n\",\"expansion_stage\":3,\"x\":788,\"y\":648,\"ox\":772,\"oy\":274,\"offer\":\"stone\",\"demand\":\"wood\",\"mood\":100,\"relation_status\":0,\"ratio\":1.25} т.е. те строки, где есть relation_status И на выходе получить примерно это: PHP: 19409 - \\u0420\\u043e\\u0441\\u043d\\u043e\\u0441\\u043a\\u043e\\u043d\\u043e\\u0441 - 1 19410 - \\u0413\\u0430\\u0433\\u0430\\u0432\\u0442\\u0430\\u044d - 1 19411 - \\u041a\\u043e\\u0433\\u0430\\u0445\\u0438\\u0434\\u0440\\u044d\\u0439 - 0 19412 - \\u0422\\u0430\\u0445\\u0438\\u0433\\u0430 - 0 19413 - \\u0420\\u043e\\u0442\\u0430\\u0440\\u043e\\u0441\\u044d - 1 19414 - \\u0414\\u043e\\u043d\\u043e\\u0441\\u0433\\u0430\\u0444\\u043e\\u0441 - 1 19415 - \\u041d\\u044d\\u0439\\u0440\\u043e\\u0441 - 0 19416 - \\u0421\\u0442\\u0440\\u0430\\u0439\\u043d\\u043e\\u0441\\u043a\\u043e\\u0443\\u0441 - 0 Т.е. мне нужно выбрать ТОЛЬКО те значения ID и Name, где есть relation_status... Мне бы помогло что-то типа этого: PHP: '#"id":([0-9]+),"name":"([^"]+).*"relation_status":([0-9]+)#i' Но .* срабатывает не так как нужно... Пробовал и .*? все не то... Я пытаюсь .* заменить группу символов стоящих между значением name и relation_status, но не получается...