popsu-d9/old.vendor/commerceguys/addressing/scripts/validate_postalcode_patterns.php
2022-04-27 11:30:43 +02:00

81 lines
3.0 KiB
PHP

<?php
/**
* Google's dataset includes regular expressions for validating postal codes.
* These regular expressions are meant to be consumed by Google's Java library,
* and compatibility with PHP's preg_match is not 100% guaranteed.
* This scripts performs validation to ensure compatibility.
*/
include '../vendor/autoload.php';
use CommerceGuys\Addressing\Address;
use CommerceGuys\Addressing\AddressFormat\AddressField;
use CommerceGuys\Addressing\AddressFormat\AddressFormatRepository;
use CommerceGuys\Addressing\Country\CountryRepository;
use CommerceGuys\Addressing\Validator\Constraints\AddressFormatConstraint;
use Symfony\Component\Validator\Validation;
$addressFormatRepository = new AddressFormatRepository();
$address = new Address();
$address = $address
->withAddressLine1('Address line1')
->withAddressLine1('Address line2')
->withLocality('Locality');
$validator = Validation::createValidator();
// Create a list of countries for which Google has definitions.
$foundCountries = ['ZZ'];
$countryRepository = new CountryRepository();
$countries = $countryRepository->getList();
$serviceUrl = 'http://i18napis.appspot.com/address';
$index = file_get_contents($serviceUrl);
foreach ($countries as $countryCode => $countryName) {
$link = "<a href='/address/data/{$countryCode}'>";
// This is still faster than running a file_exists() for each country code.
if (strpos($index, $link) !== FALSE) {
$foundCountries[] = $countryCode;
}
}
foreach ($foundCountries as $countryCode) {
$addressFormat = $addressFormatRepository->get($countryCode);
if (!in_array(AddressField::POSTAL_CODE, $addressFormat->getUsedFields())) {
continue;
}
$definition = file_get_contents('assets/google/' . $countryCode . '.json');
$definition = json_decode($definition, TRUE);
// If country definition has zip examples, check if they pass validation.
if (isset($definition['zipex'])) {
$zipExamples = explode(',', $definition['zipex']);
$address = $address->withCountryCode($countryCode);
foreach ($zipExamples as $zipExample) {
if (strpos($zipExample, ':') !== FALSE) {
// Ignore ranges for now, the non-range examples are enough.
continue;
}
$address = $address->withPostalCode($zipExample);
$violations = $validator->validate($address, new AddressFormatConstraint());
$formattedExamples = implode(', ', $zipExamples);
foreach ($violations as $violation) {
if ($violation->getPropertyPath() == '[postalCode]') {
$message = $violation->getMessage();
$postalCodePattern = $addressFormat->getPostalCodePattern();
echo "Error for countrycode '$countryCode' with postal code '$zipExample'.\n";
echo "Error: $message\n";
echo "Postal code pattern: $postalCodePattern\n";
echo "All available postal code examples: $formattedExamples\n\n";
// Once we catch an error in a country, don't try other examples.
continue 3;
}
}
}
}
}