3v4l.org

run code in 300+ PHP versions simultaneously
<?php $usPhone = '800-000-7755'; $regex = <<<'REGEX' ~ (?: \b([1-9]0{2,})\b # 1: hundreds, thousands, etc |(\d)\2+ # 2: multiples |(0) # 3: zero |([1-9]) # 4: single digit ) -? # consume optional delimiter ~x REGEX; $f = new NumberFormatter('en', NumberFormatter::SPELLOUT); $mapping = [ 2 => 'double', 3 => 'triple', 4 => 'quadruple', 5 => 'quintuple', 6 => 'sextuple', 7 => 'septuple', 8 => 'octuple', 9 => 'nonuple', 10 => 'decuple', ]; echo ltrim( preg_replace_callback( $regex, fn($m) => ' ' . match (array_key_last($m)) { 1, 4 => $f->format((int)$m[0]), 2 => $mapping[strlen(rtrim($m[0], '-'))] . " " . ($m[2] ? $f->format((int)$m[2]) : 'oh'), default => 'oh', }, $usPhone ) );
Output for 8.2.0 - 8.2.29, 8.3.0 - 8.3.27, 8.4.1 - 8.4.14
eight hundred triple oh double seven double five

preferences:
61.93 ms | 406 KiB | 5 Q