如何通过SOAP从VIES数据库收集公司数据

时间:2015-02-20 09:18:53

标签: php soap wsdl

我正在使用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';

另请注意,对于其他公司而言,街道名称或城市可以有多个单词,例如“纽约”,因此根据单词之间的空格划分数据的简单解决方案对我来说不起作用

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

据我所知,VIES数据已经在结果中内置了换行符。所以你应该能够根据换行符进行爆炸。然后,如果邮政编码是最后一个或城市,那将只是一个工作的情况。

确认我的意思:

echo nl2br($result->address);