9647701234567 * Example Iraq: +964 0780 1234 -> 9647801234 * Example Jordan: 0791234567 -> 962791234567 */ public static function normalize(string $phone, string $defaultCountryCode = '964'): string { // 1. Remove all non-digit characters (+, -, spaces, dots, brackets) $cleaned = preg_replace('/[^\d]/', '', $phone); if (empty($cleaned)) { return ''; } // 2. Remove international double-zero prefixes (e.g. 00964 -> 964) if (str_starts_with($cleaned, '00')) { $cleaned = substr($cleaned, 2); } // 3. Supported Country Code Detection & Cleaning $knownCountryCodes = ['964', '962', '20', '961', '966', '971']; foreach ($knownCountryCodes as $cc) { if (str_starts_with($cleaned, $cc)) { $localPart = substr($cleaned, strlen($cc)); // Remove any redundant leading zero after country code (e.g. 964 0770... -> 964 770...) $localPart = ltrim($localPart, '0'); return $cc . $localPart; } } // 4. If no recognized country code is attached, treat as national number with default country code // Remove leading national zero (e.g. 0770... -> 770...) $nationalPart = ltrim($cleaned, '0'); return $defaultCountryCode . $nationalPart; } /** * Formats normalized number for display in UI. * e.g. 9647701234567 -> +964 770 123 4567 */ public static function formatDisplay(string $normalized): string { if (str_starts_with($normalized, '964') && strlen($normalized) === 13) { return '+964 ' . substr($normalized, 3, 3) . ' ' . substr($normalized, 6, 3) . ' ' . substr($normalized, 9); } if (str_starts_with($normalized, '962') && strlen($normalized) === 12) { return '+962 ' . substr($normalized, 3, 2) . ' ' . substr($normalized, 5, 3) . ' ' . substr($normalized, 8); } return '+' . $normalized; } }