Я использую базу данных VIES для сбора данных компании на основе европейского номера НДС для моего приложения PHP.
Мне нужны вещи:
как отдельные данные, но база данных 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';
Также имейте в виду, что для других компаний название улицы или город может иметь более одного слова, например "Нью-Йорк", поэтому простое решение для разделения данных на основе пространства между словами не работает для меня.
Поскольку вы заявили, что почтовый код будет в формате 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
Насколько я вижу, данные VIES уже имеют новые строки, встроенные в результат. Таким образом, вы должны иметь возможность взорваться на основе символа новой строки. Тогда это будет случай разработки, если почтовый индекс является последним или городом.
Чтобы подтвердить то, что я говорю, просто:
echo nl2br($result->address);