[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Выдернуть подстроку
MisHel64
Есть строка вида:
[[5919,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,
и так далее.
Нужно в новую переменную получить значение первого числа, в этом примере 5919, а из исходной строки удалить первое число, и запятую после него.
Решения в лоб, уж больно замороченными получаются.
Может есть более красивые решения?



Спустя 5 минут, 28 секунд (18.06.2012 - 23:57) rooor написал(а):
$a = '[[5919,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,';
$a = substr($a, 3, 3);
echo $a;

Спустя 2 минуты, 35 секунд (19.06.2012 - 00:00) Invis1ble написал(а):
Цитата
Решения в лоб, уж больно замороченными получаются.

Например? Какие конкретно ты видишь решения?

Спустя 14 минут, 14 секунд (19.06.2012 - 00:14) MisHel64 написал(а):
rooor:
Циферок в первом числе может быть и не 4, а от одной до десяти.
И первое число нужно занести в новую переменную, при этом в старой удалить и первое число, и запятую, для дальнейшего разбора.

Спустя 1 час, 36 минут, 1 секунда (19.06.2012 - 01:50) FatCat написал(а):
Цитата (MisHel64 @ 19.06.2012 - 00:52)
более красивые решения?

А чем "в лоб" некрасиво?
$str = '[[5919,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,';

preg_match("/-{0,1}\d+/i", $str, $num); // Забираем первое число в переменную $num[0]

$str = // Собираем переменную
substr($str,0,strpos($str,$num[0])) // из куска строки до числа
.substr( $str,(strpos($str,$num[0])+strlen($num[0])+1) ); // и строки после числа

echo 'Найдено число: '.$num[0].',<br>Измененная строка: '.$str;

Спустя 1 час, 5 минут, 49 секунд (19.06.2012 - 02:56) MisHel64 написал(а):
Да просто сам подход, разбить строку на две, а потом склеивать кажется несколько не адекватным. Думал может есть функции удаляющие из строки подстроку, типа паскалевского DELETE.

И смысла регулярного выражения не понял. Вообще. Раньше не сталкивался.
Даже читая справочник по регулярным выражениям все равно не понимаю его смысла.

Спустя 14 минут, 40 секунд (19.06.2012 - 03:11) MisHel64 написал(а):
А вообще, задача на много сложнее.

Вот только не знаю как ее сформулировать.
В общем есть скрипт, выгружающий некие данные из своих внутренних массивов.
Эти массивы описывают карту игрового мира.
*) Первый уровень вложенности прописывает один мир.
*) Второй уровень описывает видимость одного города.
В данной строке, 5919 это код города, или Z координата.
*) На третьем уровне описывается клеточка карты, в данном примере
[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]] описывает клетку с координатами X=-5, Y=-5, остальные циферки описывают различные свойства.
*) На 4м уровне, описываются различные атрибуты этой клетки.
В данном примере это ["mi220 mp22","mw10 mx34"]

Все это передается через POST запрос на сервер.
Вот теперь задача разпарсить эти данные на PHP, что бы загнать в серверную БД. Проблема в том, что ява скрипт менять низя.
Клеточек, даже в одном мире, в одном городе очень много. Так что скорость ОЧЕНЬ критична.

Спустя 35 минут, 22 секунды (19.06.2012 - 03:46) MisHel64 написал(а):
"А чем "в лоб" некрасиво?"
Есть еще одна некрасивость. Число может быть опущено, то есть строка будет выглядеть вот так: $str = '[[,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,';

Это означает, что Z координата равна нулю.

Спустя 8 часов, 50 минут, 1 секунда (19.06.2012 - 12:36) Invis1ble написал(а):
возможно, имеет смысл рассмотреть строку как JSON ? json_decode() -> array_shift() + рекурсия, не?

Спустя 6 часов, 17 минут, 51 секунда (19.06.2012 - 18:54) MisHel64 написал(а):
Пробовал я через JSON, что то не получилось, вернулся пусто массив.
Можно кусочек реального кода, для умственного развития?

Спустя 21 минута, 15 секунд (19.06.2012 - 19:15) Invis1ble написал(а):
так например
function array_rshift_num(array &$data) {
foreach ($data as $k => &$item) {
if (is_int($item)) {
unset($data[$k]);
return $item;
}
elseif (is_array($item)) {
return array_rshift_num($item);
}
}
}


$data = json_decode('[[5919, [-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]]]]');
var_dump(array_rshift_num($data));
var_dump($data);

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

Спустя 2 часа, 53 минуты, 10 секунд (19.06.2012 - 22:08) MisHel64 написал(а):
$RAW=$_POST['data']; $Arr=json_decode($RAW); var_dump($Arr);

Вывод: NULL
В $RAW данные пришли нормально, проверенно.

Спустя 1 час, 45 минут, 29 секунд (19.06.2012 - 23:54) Invis1ble написал(а):
значит некорректный json скорее всего
http://php.net/manual/ru/function.json-decode.php
http://php.net/manual/ru/function.json-last-error.php можно проверить

Спустя 9 часов, 43 минуты, 59 секунд (20.06.2012 - 09:38) MisHel64 написал(а):
Не "некорректный" где? У хостера? Да как бы не я один там хощусь, там еще сотни людей держат свои проекты, и пока никто не жаловался. По крайне мере, ни одной жалобы на форуме поддержки я не видел.

Спустя 1 час, 49 минут, 42 секунды (20.06.2012 - 11:28) Invis1ble написал(а):
А причем здесь хостер?

Спустя 22 минуты, 7 секунд (20.06.2012 - 11:50) MisHel64 написал(а):
А кто тогда причем, если "некорректный json"?

Спустя 2 минуты, 22 секунды (20.06.2012 - 11:52) Invis1ble написал(а):
Откуда я знаю, кто причем. Источник данных, не?
И я не утверждал, что он некорректный, я высказал предположение, и указал, как его можно проверить.
Покажи полностью строку.

Спустя 17 минут, 12 секунд (20.06.2012 - 12:09) MisHel64 написал(а):
Источник данных точно не причем. Да и по виду эта строка не похожа на пример из вики (http://ru.wikipedia.org/wiki/JSON).

Полную строку не дам, она весит очень много килобайт.
Вот вариант, описывающий всего две точки, всего одного города.
[[5919,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,["mi221 mp22","mw10 mx36"]]]]

Спустя 19 минут, 1 секунда (20.06.2012 - 12:28) killer8080 написал(а):
Цитата (MisHel64 @ 20.06.2012 - 12:09)
Да и по виду эта строка не похожа на пример из вики (http://ru.wikipedia.org/wiki/JSON).

И что это по твоему, если не JSON? user posted image
$js = '[[5919,[-5,-5,-1,-1,-1,2,0,-1,-1,-1,["mi220 mp22","mw10 mx34"]],[-4,-5,-1,-1,-1,2,0,-1,-1,-1,["mi221 mp22","mw10 mx36"]]]]'; 
echo '<pre>',print_r(json_decode($js), 1),'</pre>';

Спустя 49 минут, 38 секунд (20.06.2012 - 13:18) MisHel64 написал(а):
Не знаю. Не похожа она на ту что на вике.

Попробовал. Пример работает. Вручную вставленная строка из локального хранилища, и ручками вставленная в PHP, работает.

Но вот если сделать так, ничего не меняя:
$js = $_POST['data']; - не работает.
При этом echo $js,'<br />'; исправно выводит строку.

Дописал: file_put_contents("${RD}/logz/_raw.dump",$js);
Доступно по адресу: http://www.wofh.tk/logz/_raw.dump

Спустя 8 минут, 19 секунд (20.06.2012 - 13:26) MisHel64 написал(а):
Сам клиентский скрипт, если поможет: http://www.wofh.tk/map/js/wofh_map.user.js

Спустя 40 минут, 2 секунды (20.06.2012 - 14:06) Invis1ble написал(а):
MisHel64
вот тебе пример из мануала
$data = "..."; // тут строка из твоего дампа
var_dump(json_decode($data));
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;
}

вывод:
Цитата
- Синтаксическая ошибка, не корректный JSON

Спустя 16 минут, 33 секунды (20.06.2012 - 14:23) MisHel64 написал(а):
А вот тебе пример из практики:

Fatal error: Call to undefined function json_last_error() in /home/public_html/map/import.php on line 29

и Invis1ble, личная просьба. Не пишите в этой теме больше. Вы и так себе хорошо счетчик намотали.

Спустя 6 минут, 17 секунд (20.06.2012 - 14:29) Invis1ble написал(а):
Цитата
и Invis1ble, личная просьба. Не пишите в этой теме больше.

Это еще почему, позволь поинтересоваться? huh.gif

Спустя 1 минута, 34 секунды (20.06.2012 - 14:31) killer8080 написал(а):
MisHel64
Ошибка номер раз:
- строка json была заслешена, очевидно не был отключен magic quotes
Второе - синтаксическая ошибка в json строке
вставь свой код в валидатор json http://jsonformatter.curiousconcept.com/


user posted image

Спустя 1 минута, 39 секунд (20.06.2012 - 14:32) MisHel64 написал(а):
Invis1ble: А потому, что смысла в твоих постах ноль.

Спустя 53 секунды (20.06.2012 - 14:33) killer8080 написал(а):
Цитата (MisHel64 @ 20.06.2012 - 14:23)
А вот тебе пример из практики:

Fatal error: Call to undefined function json_last_error() in /home/public_html/map/import.php on line 29

значит у тебя php < 5.3.0 RTFM
Зачем человека обижаешь? Он дело говорит.

Спустя 6 минут, 33 секунды (20.06.2012 - 14:40) Invis1ble написал(а):
Цитата
А потому, что смысла в твоих постах ноль.

ну да, ну да... Я ж тут оффтопил все это время, негодяй laugh.gif

Спустя 4 минуты, 48 секунд (20.06.2012 - 14:44) MisHel64 написал(а):
php_flag magic_quotes_gpc Off в .htaccess есть.
Это http://www.simplecoding.org/boremsya-s-magic-quotes.html читал

Спустя 4 минуты, 52 секунды (20.06.2012 - 14:49) killer8080 написал(а):
MisHel64
в том файле что ты выложил все кавычки экранированы. Я не знаю что ты где читал, я говорю о том что вижу. Как ты получаешь эти данные?

Спустя 2 минуты (20.06.2012 - 14:51) MisHel64 написал(а):
версия: 5.2.17

>> Зачем человека обижаешь? Он дело говорит.
Не нужно считать других людей глупей себя.

Спустя 2 минуты, 14 секунд (20.06.2012 - 14:54) killer8080 написал(а):
Цитата (MisHel64 @ 20.06.2012 - 14:51)
Не нужно считать других людей глупей себя.

Я не заметил в его высказываниях ничего оскорбительного. Советы он давал по делу.

Спустя 42 секунды (20.06.2012 - 14:54) MisHel64 написал(а):
Цитата (killer8080 @ 20.06.2012 - 11:49)
MisHel64
в том файле что ты выложил все кавычки экранированы. Я не знаю что ты где читал, я говорю о том что вижу. Как ты получаешь эти данные?


в 19 посте этой темы написал код.


http://phpforum.ru/index.php?act=Print&cli...imin=19&limit=1

Спустя 2 минуты, 5 секунд (20.06.2012 - 14:56) MisHel64 написал(а):
Цитата (killer8080 @ 20.06.2012 - 11:54)
Цитата (MisHel64 @ 20.06.2012 - 14:51)
Не нужно считать других людей глупей себя.

Я не заметил в его высказываниях ничего оскорбительного. Советы он давал по делу.

А никто и не говорит, что они оскорбительные. просто безполезные.

Спустя 2 минуты, 17 секунд (20.06.2012 - 14:59) killer8080 написал(а):
MisHel64
magic quotes gpc у тебя включен - это факт. Можешь посмотреть в phpinfo()
Если нет возможности его выключить (хотя странно конечно) stripslashes() тебе в помощь, но в любом случае в json ошибка - лишняя кавычка, я тебе её показал.



Спустя 3 минуты, 8 секунд killer8080 написал(а):
Цитата (MisHel64 @ 20.06.2012 - 14:56)
А никто и не говорит, что они оскорбительные. просто безполезные.

От чего же бесполезные? Тебе показали как посмотреть ошибку json_decode, а то что у тебя версия пыха по древнее, так в этом никто ж не виноват wink.gif

Спустя 28 минут, 2 секунды (20.06.2012 - 15:27) MisHel64 написал(а):
Да я ее и так вижу. Проблема в том, то это не JSON.
Да, немного похож. И в частном случае совместим. Но только в частном. Но это не он.
И бороться с ошибками парсера, не имеет смысла совершенно, пока входные данные не будут полностью совместимы с ним. Я уже сделал разбор, и без него. А то, что лапки экранируются, это не самое страшное.
По этому я просто не вижу смыла, в тыкании в мануалы по JSON, рассуждения на тему обнаружения ошибки, разглагольствований кто в этом виноват, и прочее. Это не JSON. Все.
Парсер заткнулся на обработке одного "хопа", одного города. А таких "хопов" у каждого города сотни. И городов сотни.

Спустя 4 минуты, 30 секунд (20.06.2012 - 15:31) MisHel64 написал(а):
Цитата (killer8080 @ 20.06.2012 - 11:59)
MisHel64
magic quotes gpc у тебя включен - это факт.

Что-то мне подсказывает, что все же нет: http://www.wofh.tk/map/php_info.php

Спустя 46 минут, 33 секунды (20.06.2012 - 16:18) killer8080 написал(а):
Цитата (MisHel64 @ 20.06.2012 - 15:27)
Проблема в том, то это не JSON.

Это JSON, просто криво сгененрированный.
Цитата (MisHel64 @ 20.06.2012 - 15:27)
Парсер заткнулся на обработке одного "хопа", одного города. А таких "хопов" у каждого города сотни. И городов сотни.

json_decode заткнулся на лишней кавычке (если убрать слеши)
Цитата
[0,0,"1x.XXX"","Белочка",-1,2,0,-1,-1,-1,["mi221 mp22","mt mt03"]]

Спустя 2 минуты, 18 секунд (20.06.2012 - 16:20) Invis1ble написал(а):
killer8080
"Не нужно считать других людей глупей себя."
Если ТС говорит, что это не json - значит так и есть cool.gif smile.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.