3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * Created by PhpStorm. * User: Martin Jirásek <martin.jirasek@nms.cz> * Date: 31.03.2017 * Time: 12:41 */ class PhoneNumberManager { const PREFIX_SYMBOL_ZEROS = '00'; const PREFIX_SYMBOL_PLUS = '+'; private static $prefixSymbols = [ self::PREFIX_SYMBOL_ZEROS, self::PREFIX_SYMBOL_PLUS, ]; /** * @return array */ public static function internationalPrefixNumbers() { return [ '420', // cz '421', // sk ]; } /** * @param $phoneNumber * @return string */ public static function getPhoneNumberBase($phoneNumber) { return substr($phoneNumber, 0, -9); } /** * @param $phoneNumber * @return array|bool */ public static function getRecognizedCountryPrefixes($phoneNumber) { $prefixes = []; $prefixPart = self::getPhoneNumberBase($phoneNumber); $internationalPrefixNumbers = self::internationalPrefixNumbers(); if (strlen($prefixPart) <= min(array_map('strlen', $internationalPrefixNumbers))) { return false; } foreach ($internationalPrefixNumbers as $prefix) { if (!$prefixPart || strpos($prefixPart, $prefix) !== false) { foreach (self::$prefixSymbols as $prefixType) { $prefixes[] = $prefixType . $prefix; } } } return $prefixes; } /** * @param $phoneNumber * @return array|bool */ public static function getPhoneNumberInAllPossibleForms($phoneNumber) { $prefixes = self::getRecognizedCountryPrefixes($phoneNumber); if ($prefixes === false) { return false; } $forms = []; foreach ($prefixes as $prefix) { $forms[] = $prefix . self::getPhoneNumberBase($phoneNumber); } return $forms; } /** * @param $phoneNumber * @return bool|string */ public static function convertToRightForm($phoneNumber) { $forms = self::getPhoneNumberInAllPossibleForms($phoneNumber); if ($forms === false) { return false; } foreach ($forms as $form) { if (substr($form, 0, strlen(self::PREFIX_SYMBOL_PLUS)) === self::PREFIX_SYMBOL_PLUS) { return $form; } } return false; } /** * @param $phoneNumber * @return bool */ public static function isValid($phoneNumber) { if (!$phoneNumber) { return false; } $recognizedCountryPrefixes = self::getRecognizedCountryPrefixes($phoneNumber); if ($recognizedCountryPrefixes === false) { return false; } $regexPrefixes = array_map(function ($value) { return strpos($value, '+') !== false ? "\\$value" : $value; // escape for regex }, $recognizedCountryPrefixes); return (bool) preg_match('~^(' . implode('|', $regexPrefixes) . ')' /*. '?' */. '[0-9]{9}$~', $phoneNumber); } } var_dump('getPhoneNumberBase'); var_dump(PhoneNumberValidator::getPhoneNumberBase("608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("0608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("421608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("+421608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("00421608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("+420608171262")); var_dump(PhoneNumberValidator::getPhoneNumberBase("00420608171262")); var_dump('isValid'); var_dump(PhoneNumberValidator::isValid("608171262")); var_dump(PhoneNumberValidator::isValid("0608171262")); var_dump(PhoneNumberValidator::isValid("420608171262")); var_dump(PhoneNumberValidator::isValid("+421608171262")); var_dump(PhoneNumberValidator::isValid("00421608171262")); var_dump(PhoneNumberValidator::isValid("+420608171262")); var_dump(PhoneNumberValidator::isValid("00420608171262")); var_dump('getRecognizedCountryPrefixes'); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("0608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("420608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("+421608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("00421608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("+420608171262")); var_dump(PhoneNumberValidator::getRecognizedCountryPrefixes("00420608171262")); var_dump('getPhoneNumberInAllPossibleForms'); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("0608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("420608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("+421608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("00421608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("+420608171262")); var_dump(PhoneNumberValidator::getPhoneNumberInAllPossibleForms("00420608171262")); var_dump('convertToRightForm'); var_dump(PhoneNumberValidator::convertToRightForm("608171262")); var_dump(PhoneNumberValidator::convertToRightForm("0608171262")); var_dump(PhoneNumberValidator::convertToRightForm("420608171262")); var_dump(PhoneNumberValidator::convertToRightForm("+421608171262")); var_dump(PhoneNumberValidator::convertToRightForm("00421608171262")); var_dump(PhoneNumberValidator::convertToRightForm("+420608171262")); var_dump(PhoneNumberValidator::convertToRightForm("00420608171262"));
Output for 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.18, 8.3.0 - 8.3.4, 8.3.6
string(18) "getPhoneNumberBase" Fatal error: Uncaught Error: Class "PhoneNumberValidator" not found in /in/VZjsN:121 Stack trace: #0 {main} thrown in /in/VZjsN on line 121
Process exited with code 255.
Output for 8.3.5
Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0 string(18) "getPhoneNumberBase" Fatal error: Uncaught Error: Class "PhoneNumberValidator" not found in /in/VZjsN:121 Stack trace: #0 {main} thrown in /in/VZjsN on line 121
Process exited with code 255.
Output for 7.0.0 - 7.0.33, 7.1.0 - 7.1.33, 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33
string(18) "getPhoneNumberBase" Fatal error: Uncaught Error: Class 'PhoneNumberValidator' not found in /in/VZjsN:121 Stack trace: #0 {main} thrown in /in/VZjsN on line 121
Process exited with code 255.
Output for 5.6.0 - 5.6.40
string(18) "getPhoneNumberBase" Fatal error: Class 'PhoneNumberValidator' not found in /in/VZjsN on line 121
Process exited with code 255.

preferences:
270.17 ms | 401 KiB | 288 Q