3v4l.org

run code in 300+ PHP versions simultaneously
<?php class Number { /** * Assert if a number can be validate using Luhn Checksum * * Applies to : * Can be applid to : Siren, Siret, Credit card number, IMEI Number * Modulo can be overrided for custom control * simpleSum just sum all digits... * * @todo est-ce que l'on garde la somme simple au milieu de luhn... * * @param string|int $number * @param int $modulo * @param boolean $simpleSum * @return bool */ public static function assertLuhn($number, $modulo = 10, $simpleSum = false) { // Must be numeric and not a float if (!is_numeric($number) || is_float($number)) { return false; } // Begin Luhn Check $digits = array_reverse(str_split((string) $number)); $count = count($digits); $total = 0; for ($i = 0; $i < $count; ++$i) { if (($i + 1) % 2 !== 0 || $simpleSum) { $total += (int) $digits[$i]; } else { $total += array_sum(str_split((string) ((int) $digits[$i] * 2))); } } return $total % $modulo === 0; } /** * Assert if a number is a valid siren * * @param string|int $number * @return bool */ public static function assertSiren($number) { if (!self::assertLuhn($number)) { return false; } if (strlen($number) > 9 || strlen($number) < 5) { return false; } if (substr($number, 0, 5) === '00000') { return false; } return true; } /** * Assert if a number is a valid siren * * @param string|int $number * @return bool */ public static function assertSiret($number) { // @todo : extraction siren à mettre ailleurs $siren = substr($number, 0, 9); $modulo = 10; $simpleSum = false; // Le cas de "la poste", il y a plus de 10 000 etablissement, le modulo 10 ne fonctionne pas // Le modulo 5 est utilisé à la place // Sauf pour 35600000000048 qui est un siret validé avec luhn if ((int) $siren === 356000000 && (int) $number !== 35600000000048) { $modulo = 5; $simpleSum = true; } if (!self::assertSiren($siren) || !self::assertLuhn($number, $modulo, $simpleSum)) { return false; } if (strlen($number) > 14 || strlen($number) < 10) { return false; } return true; } } // (FR)?[0-9A-Z]{2}[0-9]{9} preg_match('/(FR)\s?[0-9A-Z]{2}\s?[0-9]{9}/', 'FR 52 056800659', $matches); var_export(Number::assertSiret(str_replace(' ', '', '056 800 659 00155'))); echo "\r\n"; var_export($matches);
Output for 7.2.29 - 7.2.33, 7.3.16 - 7.3.33, 7.4.4 - 7.4.33, 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
true array ( 0 => 'FR 52 056800659', 1 => 'FR', )
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 true array ( 0 => 'FR 52 056800659', 1 => 'FR', )

preferences:
151.92 ms | 402 KiB | 135 Q