Как собрать данные компании из базы данных VIES через SOAP

0

Я использую базу данных VIES для сбора данных компании на основе европейского номера НДС для моего приложения PHP.

Мне нужны вещи:

  • город
  • название улицы
  • номер дома
  • почтовый индекс
  • имя comapny

как отдельные данные, но база данных VIES дает мне все это как одну строку.

Рабочий пример:

<?php
try {
    $opts = array(
        'http' => array(
            'user_agent' => 'PHPSoapClient'
        )
    );
    $context = stream_context_create($opts);

    $client = new SoapClient(
        'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl',
        array('stream_context' => $context,
              'cache_wsdl'     => WSDL_CACHE_NONE)
    );

    $result = $client->checkVat(
        array(
            'countryCode' => 'PL',
            'vatNumber'   => '5242106963'
        )
    );
    print_r($result);
} catch (Exception $e) {
    echo $e->getMessage();
}
?>

Я получаю:

stdClass Object (
    [countryCode] => PL
    [vatNumber] => 5242106963
    [requestDate] => 2015-02-20+01:00
    [valid] => 1
    [name] => COCA-COLA HBC POLSKA SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ
    [address] => ANNOPOL 20 03-236 WARSZAWA
)

Но мне нужен адрес:

$street='ANNOPOL';
$number='20';
$city='WARSZAWA';
$postcode='03-236';

Также имейте в виду, что для других компаний название улицы или город может иметь более одного слова, например "Нью-Йорк", поэтому простое решение для разделения данных на основе пространства между словами не работает для меня.

  • 1
    Первая ссылка не указывает ни на что, что показывает пример «предоставления ... всего этого как одного текста». Можете ли вы удалить ссылку и добавить в пример записи?
  • 1
    Если вы хотите получать структурированные данные, SOAP является хорошим подходом. Есть ли на их сайтах в ЕС руководство или раздел для разработчиков, чтобы показать вам, как сделать SOAP-вызов в их службу? Ваш вопрос, скорее всего, будет отложен в том виде, в каком он есть, поскольку нет кода для помощи, и он достаточно широк. Поэтому, если вы можете попробовать, это даст читателям совет.
Теги:
soap
wsdl

2 ответа

0
Лучший ответ

Поскольку вы заявили, что почтовый код будет в формате 99-999 и предполагается, что номер улицы (+ любая плоская идентификация) всегда начинается с числа, вы можете использовать preg_match для синтаксического анализа адресной строки:

$result = new stdClass();
$result->address = 'Wita Stwosza 15 M5 31-042 Kraków';

preg_match(
    '#'
    . '(.*?)'             // Match as many chars as possible (street)
    . '\s+(\d+(?:.*?))'   // Space, then number and possibly flat (number)
    . '\s+(\d\d\-\d\d\d)' // Space, then digits/dash/digits (postcode)
    . '\s(.*)'            // Space, then everything after that (city)
    . '#',
    $result->address,
    $matches
);
list ($street, $number, $postcode, $city) = array_slice($matches, 1);

echo "Street:   $street", PHP_EOL;
echo "Number:   $number", PHP_EOL;
echo "Postcode: $postcode", PHP_EOL;
echo "City:     $city", PHP_EOL;

Вывод:

Street:   Wita Stwosza
Number:   15 M5
Postcode: 31-042
City:     Kraków
  • 0
    Очень интересное решение, однако я не уверен, будет ли это универсальным. Например, другие данные VIES: Wita Stwosza 15 M5 31-042 Kraków. Таким образом, у нас всегда есть такой формат: Улица Номер Почтовый индекс Город Что важно, Posctode - это 2 гигабита, тире и 3 цифры. Пример 12-345 Единственная проблема - это название улицы и номер. В этом сценарии «Вита Stwosza» является улицей, а «15 М5» является число и квартира. ..но даже название улицы с номером будет в порядке. Итак, как разделить 'Wita Stwosza 15 M5 31-042 Kraków' на улицу + номер, почтовый индекс, город
  • 0
    Вита Stwosza 15 M5 31-042 Краков
Показать ещё 2 комментария
0

Насколько я вижу, данные VIES уже имеют новые строки, встроенные в результат. Таким образом, вы должны иметь возможность взорваться на основе символа новой строки. Тогда это будет случай разработки, если почтовый индекс является последним или городом.

Чтобы подтвердить то, что я говорю, просто:

echo nl2br($result->address);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню