Декодировать данные, закодированные индивидуваьным алгоритмом

Занимаюсь парсингом сайта написанного на ASP.NET (www.iaai.com/Vehicles/VehicleAdvSearch.aspx?savepreference=true#anchorSearchResults) и там на каждый клик почти срабатывает JS функция __doPostBack() которая ajax-ом отправляет форму, и в ответ получает что-то вроде такого http://pastebin.com/c7eb9XhH проанализировав немного получилось составить задачу которую нужно выполить:
И так предполодим что наш ответ был такой:
10|updatePanel|h2.header|Привет мир|20|updatePanel|p.search|Элементов не найдено|0|deleteBox|#results||
Эта строка написана мной, но в ней используется тот же принцип что и в той что мне возвращается от ASP.NET.
И так прицип действия тут такой:
Эта строка состоит из трех блоков имеющих одинаковый принцип посторения который я хочу в итоге сохранить в ассоциативный массив. И так позьмем первый блок и разберем его:
10|updatePanel|h2.header|Привет мир|
Этот блок состоит из четырех подблоков разделенных символом |
1) 10 это количество символов в четвертом подблоке, для того чтоб не экранировтаь в нем наверно
2) updatePanel предположим что это действие, которое мы должны выполнить
3) h2.header это селектор над которым выполняется действие
4) Привет мир это строка из 10 символов(которые мы сразу указали)
И так задача представить это все в виде массива вот так:

$array = array(
    'updatePanel' => array(
        'h2.header' => 'Привет мир',
        'p.search'  => 'Элементов не найдено'
    ),
    'deleteBox'   => array(
        '#results' => ''
    )
);

Но этот массив должен создаваться не в ручную, а самим php, что-то не могу понять с чего даже начать писать функцию.
  • Вопрос задан
  • 3566 просмотров
Решения вопроса 1
AterCattus
@AterCattus
Люблю быстрый backend
Ну если интересует просто решение на PHP, то можно начать с такого
<?php
$s = '10|updatePanel|h2.header|Привет мир|20|updatePanel|p.search|Элементов не найдено|0|deleteBox|#results||';

mb_internal_encoding('UTF-8');

function fetchBlock($str, $offset)
{
    $p = mb_strpos($str, '|', $offset);
    if (false === $p) {
        return null;
    }
    $size = (int)mb_substr($str, $offset, $p-$offset);
    $offset = $p+1;

    $p = mb_strpos($str, '|', $offset);
    $name = mb_substr($str, $offset, $p-$offset);
    $offset = $p+1;

    $p = mb_strpos($str, '|', $offset);
    $key = mb_substr($str, $offset, $p-$offset);
    $offset = $p+1;

    $value = mb_substr($str, $offset, $size);
    $offset = $offset+mb_strlen($value);

    return array('offset' => $offset+1, 'block' => array($name => array($key => $value)));
}

$result = array();

$block = array('offset' => 0);
while ($block = fetchBlock($s, $block['offset'])) {
    $result = array_merge_recursive($result, $block['block']);
}

print_r($result);


На регулярках можно сделать компактнее, но для больших текстов (не как тут одной строкой) так будет пошустрее.

Возвращает именно то, что указано в вопросе.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
alekciy
@alekciy
Вёбных дел мастер
В такой ситуации проще использовать серверные браузерные движки в духе PhantomJS. На выходе получаем сгенерированный html и не важно, что так и как кодируется. Все, что доступно в браузере, доступно и такого парсеру.
Ответ написан
NikolasSumrak
@NikolasSumrak
Senior PHP Developer
Мб wget, wget+python, и тп?

Что до php, то, если я правильно понял задачу, то не вижу сложностей, хмм.
Если ответ состоит строго из нескольких частей по 4 блока например.
RegExp ы, и вперед. Или explode, и всякие substr.
Ответ написан
NikolasSumrak
@NikolasSumrak
Senior PHP Developer
А получение данных curl + все те же regexp на поиск вызова js функции
Ответ написан
NikolasSumrak
@NikolasSumrak
Senior PHP Developer
Разве такой вариант не будет работать? Хмм.
$text = "10|updatePanel|h2.header|Привет мир|20|updatePanel|p.search|Элементов не найдено|0|deleteBox|#results||";
$array = array();
while(mb_strlen($text)>0) {
	$data = explode('|', $text);
	$str = "{$data[0]}|{$data[1]}|{$data[2]}|";
	$data[3] = substr($text, (strpos($text, $str) + mb_strlen($str)), $data[0]);
	$array[$data[1]][$data[2]] = $data[3];
	$text = str_replace($str.$data[3], '', $text, 1)
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽