Непонятная проблема с обработкой строк [PHP]
1.
Антон (01.07.2013 / 19:33)
Доброго времени суток всем!
Пишу парсер для сайта, кодировка у сайта UTF-8, у моих скриптов аналогичная, идем дальше.. Получаю зашифрованные данные от сайта в виде таких строк
\u0028\u0066\u0075\u006e\
Разбираю их следующим способом
function replace_unicode_escape_sequence($match) {
return mb_convert_encoding(pack('H*', $match[1]), "UTF-8", "auto");
}
$coded = preg_replace_callback('/\\\\u([0-9a-f]{4})/sU', 'replace_unicode_escape_sequence', $coded);
После перекодировки с данным не возможно работать, preg_match() вообще не обращает внимания ни на какие регулярки.. К примеру, после раскодирования на выходе получаю json данные, пробую их декодировать в массив при помощи функции json_decode(), функция мне возвращает NULL то есть нет данных для вывода, хотя если эти самые json данные указать напрямую в скрипте
print_r(json_decode('json строка'));
То они успешно декодируются в нужный мне массив. Пните плиз в правильном направлении, а то уже 2 часа сижу гуглу надоедаю..
2.
Алексей (01.07.2013 / 19:39)
Создай файл заново и вставь в него готовый код или имя файла смени.
3.
Антон (01.07.2013 / 19:46)
2.
ByKuznec, сори не осилил твой пост.. При чем тут файл?
4.
Кевин Митник (01.07.2013 / 19:57)
вроде как ты ищешь регуляркой в бинарной строке?
5.
Антон (01.07.2013 / 19:59)
4.
Кевин Митник_HHTeam, разве в бинарной? При выводе данных в браузер они нормально отображаются..
6.
Кевин Митник (01.07.2013 / 20:02)
Вот это - \u0028\u0066\u0075\u006e\ - 16ричная система. Ты функцией pack преобразовываешь в двоичную
7.
Алексей (01.07.2013 / 20:02)
3.
WmLiM, при том, что если файл сохраняешь в несколько раз в разных кодировках, то на выводе может получится ошибка. В самого была подобная ситуация, делал все верно, а оно не работало должным образом. Теперь осилил?
8.
колбаса (01.07.2013 / 20:06)
ох и не лёгкая это работа
9.
Антон (01.07.2013 / 20:11)
7.
ByKuznec, ты когда парсишь данные с другого сайта, вначале разбираешь ответ по полочкам и потом сохраняешь в файл или наоборот? Осилил? В первом посте написанно что трабл возникает на этапе обработки ответа.
Добавлено через 01:29 сек.
6.
Кевин Митник_HHTeam, вот за дельный совет спасибо тебе)) Пойду проверю...
10.
Кевин Митник (01.07.2013 / 20:14)
ТС, последовательность операций не верная.
1. Данные, а именно 16-ричное представление очищаешь от \u.
2. Обработка hex2bin. На выходе двоичные данные.
3. Изменение кодировки
Добавлено через 01:09 сек.
я только что проверил. работает
11.
Антон (01.07.2013 / 20:19)
Кевин Митник_HHTeam (2 Июля 2013 / 01:14)
2. Обработка hex2bin. На выходе двоичные данные.
С сайта php.net
Предостережение
Эта функция НЕ конвертирует шестнадцатиричные числа в двоичные. Если нужно именно это, используйте функцию base_convert().
12.
Кевин Митник (01.07.2013 / 20:27)
11.
WmLiM, так оно тебе и не нужно) но можно и другую ф-цию использовать. Суть в результате.
13.
Антон (01.07.2013 / 20:28)
12.
Кевин Митник_HHTeam, та да, спасибо за помощь))
14.
Кевин Митник (01.07.2013 / 20:59)
незачто)
15.
Антон (02.07.2013 / 16:10)
14.
Кевин Митник_HHTeam, все оказалось намного проще чем я думал, то что я пытался раскодировать была закодированная json строка в UTF-8 кодировке. Раскодируется таким способом
$coded = utf8_encode($coded);
$data = json_decode('{"decoded":"'.$coded.'"}', true);
URL:
https://visavi.net/topics/38319