Convert Figma logo to code with AI

giggsey logolibphonenumber-for-php

PHP version of Google's phone number handling library

4,726
464
4,726
2

Top Related Projects

Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.

A simpler (and smaller) rewrite of Google Android's libphonenumber library in javascript

A JavaScript plugin for entering and validating international telephone numbers. Now includes React and Vue components.

Phone number functionality for Laravel

Quick Overview

libphonenumber-for-php is a PHP port of Google's libphonenumber library. It provides phone number parsing, formatting, and validation capabilities for international phone numbers. This library is essential for applications that need to handle phone numbers from various countries and formats.

Pros

  • Comprehensive support for international phone numbers
  • Regular updates to keep pace with the original Google library
  • Extensive validation and formatting options
  • Well-documented and easy to integrate into PHP projects

Cons

  • Relatively large library size, which may impact performance in some cases
  • Requires periodic updates to maintain accuracy with changing phone number formats
  • May have occasional discrepancies with the original Google library due to porting delays

Code Examples

  1. Parsing a phone number:
use libphonenumber\PhoneNumberUtil;

$phoneUtil = PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse("+44 20 7031 3000", "GB");
  1. Formatting a phone number:
use libphonenumber\PhoneNumberFormat;

$formattedNumber = $phoneUtil->format($phoneNumber, PhoneNumberFormat::INTERNATIONAL);
echo $formattedNumber; // +44 20 7031 3000
  1. Validating a phone number:
$isValid = $phoneUtil->isValidNumber($phoneNumber);
echo $isValid ? "Valid" : "Invalid";
  1. Getting the type of a phone number:
use libphonenumber\PhoneNumberType;

$numberType = $phoneUtil->getNumberType($phoneNumber);
echo PhoneNumberType::values()[$numberType]; // FIXED_LINE

Getting Started

  1. Install the library using Composer:
composer require giggsey/libphonenumber-for-php
  1. Use the library in your PHP code:
require_once 'vendor/autoload.php';

use libphonenumber\PhoneNumberUtil;
use libphonenumber\PhoneNumberFormat;

$phoneUtil = PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse("+1 650-253-0000", "US");
$formattedNumber = $phoneUtil->format($phoneNumber, PhoneNumberFormat::NATIONAL);
echo $formattedNumber; // (650) 253-0000

Competitor Comparisons

Google's common Java, C++ and JavaScript library for parsing, formatting, and validating international phone numbers.

Pros of libphonenumber

  • Original implementation by Google, ensuring high accuracy and regular updates
  • Supports multiple programming languages (Java, C++, JavaScript)
  • Extensive documentation and community support

Cons of libphonenumber

  • Larger library size, potentially impacting performance in some applications
  • More complex setup and integration process for certain languages
  • May include unnecessary features for projects only requiring PHP support

Code Comparison

libphonenumber (Java):

PhoneNumberUtil phoneUtil = PhoneNumberUtil.getInstance();
try {
  PhoneNumber number = phoneUtil.parse("202-456-1414", "US");
  System.out.println(phoneUtil.format(number, PhoneNumberFormat.INTERNATIONAL));
} catch (NumberParseException e) {
  System.err.println("NumberParseException was thrown: " + e.toString());
}

libphonenumber-for-php (PHP):

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
try {
    $number = $phoneUtil->parse("202-456-1414", "US");
    echo $phoneUtil->format($number, \libphonenumber\PhoneNumberFormat::INTERNATIONAL);
} catch (\libphonenumber\NumberParseException $e) {
    echo "NumberParseException was thrown: " . $e->getMessage();
}

The code structure is similar, with minor syntax differences due to the programming languages. libphonenumber-for-php provides a more straightforward implementation for PHP-specific projects, while libphonenumber offers broader language support.

A simpler (and smaller) rewrite of Google Android's libphonenumber library in javascript

Pros of libphonenumber-js

  • Written in JavaScript, making it more suitable for web and Node.js projects
  • Smaller package size, which can lead to faster load times and reduced bundle sizes
  • Easier to integrate into JavaScript-based projects without additional language dependencies

Cons of libphonenumber-js

  • May have fewer features compared to the more comprehensive libphonenumber-for-php
  • Potentially less frequent updates or maintenance compared to the PHP version
  • Might have slight differences in behavior or accuracy due to being a separate implementation

Code Comparison

libphonenumber-js:

import { parsePhoneNumber } from 'libphonenumber-js'

const phoneNumber = parsePhoneNumber('+12133734253')
console.log(phoneNumber.formatNational())

libphonenumber-for-php:

use libphonenumber\PhoneNumberUtil;

$phoneUtil = PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse("+12133734253", "US");
echo $phoneUtil->format($phoneNumber, PhoneNumberFormat::NATIONAL);

Both libraries provide similar functionality for parsing and formatting phone numbers, but with syntax and usage patterns specific to their respective languages. The JavaScript version may be more concise in some cases, while the PHP version might offer more extensive options and methods.

A JavaScript plugin for entering and validating international telephone numbers. Now includes React and Vue components.

Pros of intl-tel-input

  • User-friendly interface with a dropdown for country selection and flag display
  • Client-side validation for phone numbers
  • Supports multiple input formats and automatic formatting

Cons of intl-tel-input

  • Limited to client-side functionality, lacking server-side validation
  • May require additional server-side processing for complete phone number validation
  • Less comprehensive database of phone number formats compared to libphonenumber-for-php

Code Comparison

intl-tel-input (JavaScript):

$("#phone").intlTelInput({
  utilsScript: "path/to/utils.js",
  preferredCountries: ["us", "gb"]
});

libphonenumber-for-php (PHP):

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse($number, "US");
$isValid = $phoneUtil->isValidNumber($phoneNumber);

intl-tel-input focuses on providing a user-friendly input interface with client-side validation, while libphonenumber-for-php offers more comprehensive server-side validation and formatting capabilities. intl-tel-input is ideal for enhancing user experience, but may need to be complemented with server-side validation for robust phone number processing. libphonenumber-for-php provides a more complete solution for phone number handling but requires server-side implementation.

Phone number functionality for Laravel

Pros of Laravel-Phone

  • Specifically designed for Laravel, offering seamless integration with the framework
  • Provides Laravel-specific features like validation rules and Blade directives
  • Lighter weight and more focused on Laravel use cases

Cons of Laravel-Phone

  • Less comprehensive phone number handling compared to libphonenumber-for-php
  • May not be suitable for non-Laravel PHP projects
  • Fewer updates and potentially less maintenance compared to libphonenumber-for-php

Code Comparison

Laravel-Phone validation rule:

'phone' => 'phone:AUTO,US'

libphonenumber-for-php usage:

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse($number, "US");
$isValid = $phoneUtil->isValidNumber($phoneNumber);

Laravel-Phone is more concise for Laravel-specific use cases, while libphonenumber-for-php offers more detailed control and functionality for general PHP applications.

Convert Figma logo designs to code with AI

Visual Copilot

Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.

Try Visual Copilot

README

libphonenumber for PHP Build Status Coverage Status

Total Downloads Downloads per month Latest Stable Version License

What is it?

A PHP library for parsing, formatting, storing and validating international phone numbers. This library is based on Google's libphonenumber.

Installation

PHP versions 5.3 to PHP 8.3 are currently supported.

The PECL mbstring extension is required.

It is recommended to use composer to install the library.

$ composer require giggsey/libphonenumber-for-php

You can also use any other PSR-4 compliant autoloader.

If you do not use composer, ensure that you also load any dependencies that this project has, such as giggsey/locale.

giggsey/libphonenumber-for-php-lite

If you only want to make use of the core PhoneNumber Util functionality, you can use giggsey/libphonenumber-for-php-lite, which offers a much smaller package size.

Documentation

Online Demo

An online demo is available, and the source can be found at giggsey/libphonenumber-example.

Highlights of functionality

  • Parsing/formatting/validating phone numbers for all countries/regions of the world.
  • getNumberType - gets the type of the number based on the number itself; able to distinguish Fixed-line, Mobile, Toll-free, Premium Rate, Shared Cost, VoIP and Personal Numbers (whenever feasible).
  • isNumberMatch - gets a confidence level on whether two numbers could be the same.
  • getExampleNumber/getExampleNumberByType - provides valid example numbers for all countries/regions, with the option of specifying which type of example phone number is needed.
  • isValidNumber - full validation of a phone number for a region using length and prefix information.
  • PhoneNumberOfflineGeocoder - provides geographical information related to a phone number.
  • PhoneNumberToTimeZonesMapper - provides timezone information related to a phone number.
  • PhoneNumberToCarrierMapper - provides carrier information related to a phone number.

Versioning

This library will try to follow the same version numbers as Google. There could be additional releases where needed to fix critical issues that can not wait until the next release from Google.

This does mean that this project may not follow Semantic Versioning, but instead Google's version policy. As a result, jumps in major versions may not actually contain any backwards incompatible changes. Please read the release notes for such releases.

Google try to release their versions according to Semantic Versioning, as laid out of in their Versioning Guide.

Quick Examples

Let's say you have a string representing a phone number from Switzerland. This is how you parse/normalize it into a PhoneNumber object:

$swissNumberStr = "044 668 18 00";
$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
try {
    $swissNumberProto = $phoneUtil->parse($swissNumberStr, "CH");
    var_dump($swissNumberProto);
} catch (\libphonenumber\NumberParseException $e) {
    var_dump($e);
}

At this point, swissNumberProto contains:

class libphonenumber\PhoneNumber#9 (7) {
 private $countryCode =>
  int(41)
 private $nationalNumber =>
  double(446681800)
 private $extension =>
  NULL
 private $italianLeadingZero =>
  NULL
 private $rawInput =>
  NULL
 private $countryCodeSource =>
  NULL
 private $preferredDomesticCarrierCode =>
  NULL
}

Now let us validate whether the number is valid:

$isValid = $phoneUtil->isValidNumber($swissNumberProto);
var_dump($isValid); // true

There are a few formats supported by the formatting method, as illustrated below:

// Produces "+41446681800"
echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::E164);

// Produces "044 668 18 00"
echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::NATIONAL);

// Produces "+41 44 668 18 00"
echo $phoneUtil->format($swissNumberProto, \libphonenumber\PhoneNumberFormat::INTERNATIONAL);

You could also choose to format the number in the way it is dialled from another country:

// Produces "011 41 44 668 1800", the number when it is dialled in the United States.
echo $phoneUtil->formatOutOfCountryCallingNumber($swissNumberProto, "US");

// Produces "00 41 44 668 18 00", the number when it is dialled in Great Britain.
echo $phoneUtil->formatOutOfCountryCallingNumber($swissNumberProto, "GB");

Geocoder

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();

$swissNumberProto = $phoneUtil->parse("044 668 18 00", "CH");
$usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US");
$gbNumberProto = $phoneUtil->parse("0161 496 0000", "GB");

$geocoder = \libphonenumber\geocoding\PhoneNumberOfflineGeocoder::getInstance();

// Outputs "Zurich"
echo $geocoder->getDescriptionForNumber($swissNumberProto, "en_US");

// Outputs "Zürich"
echo $geocoder->getDescriptionForNumber($swissNumberProto, "de_DE");

// Outputs "Zurigo"
echo $geocoder->getDescriptionForNumber($swissNumberProto, "it_IT");

// Outputs "Mountain View, CA"
echo $geocoder->getDescriptionForNumber($usNumberProto, "en_US");

// Outputs "Mountain View, CA"
echo $geocoder->getDescriptionForNumber($usNumberProto, "de_DE");

// Outputs "미국" (Korean for United States)
echo $geocoder->getDescriptionForNumber($usNumberProto, "ko-KR");

// Outputs "Manchester"
echo $geocoder->getDescriptionForNumber($gbNumberProto, "en_GB");

// Outputs "영국" (Korean for United Kingdom)
echo $geocoder->getDescriptionForNumber($gbNumberProto, "ko-KR");

ShortNumberInfo

$shortNumberInfo = \libphonenumber\ShortNumberInfo::getInstance();

// true
var_dump($shortNumberInfo->isEmergencyNumber("999", "GB"));

// true
var_dump($shortNumberInfo->connectsToEmergencyNumber("999", "GB"));

// false
var_dump($shortNumberInfo->connectsToEmergencyNumber("911", "GB"));

// true
var_dump($shortNumberInfo->isEmergencyNumber("911", "US"));

// true
var_dump($shortNumberInfo->connectsToEmergencyNumber("911", "US"));

// false
var_dump($shortNumberInfo->isEmergencyNumber("911123", "US"));

// true
var_dump($shortNumberInfo->connectsToEmergencyNumber("911123", "US"));

Mapping Phone Numbers to carrier

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$swissNumberProto = $phoneUtil->parse("798765432", "CH");

$carrierMapper = \libphonenumber\PhoneNumberToCarrierMapper::getInstance();
// Outputs "Swisscom"
echo $carrierMapper->getNameForNumber($swissNumberProto, "en");

Mapping Phone Numbers to TimeZones

$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$swissNumberProto = $phoneUtil->parse("798765432", "CH");

$timeZoneMapper = \libphonenumber\PhoneNumberToTimeZonesMapper::getInstance();
// returns array("Europe/Zurich")
$timeZones = $timeZoneMapper->getTimeZonesForNumber($swissNumberProto);

FAQ

Problems with Invalid Numbers?

This library uses phone number metadata from Google's libphonenumber. If this library is working as intended, it should provide the same result as the Java version of Google's project.

If you believe that a phone number is returning an incorrect result, first test it with libphonenumber via their Online Demo. If that returns the same result as this project, and you feel it is in error, raise it as an Issue with the libphonenumber project.

If Google's Online Demo gives a different result to the libphonenumber-for-php demo, then please raise an Issue here.

Generating data

Generating the data is not normally needed, as this repository will generally always have the up to data metadata.

If you do need to generate the data, the commands are provided by Phing. Ensure you have all the dev composer dependencies installed, then run

$ vendor/bin/phing compile

This compile process clones the libphonenumber project at the version specified in METADATA-VERSION.txt.

Running tests

This project uses PHPUnit Bridge to maintain compatibility for the supported PHP versions.

To run the tests locally, run the ./phpunit script.

Integration with frameworks

Other packages exist that integrate libphonenumber-for-php into frameworks.

FrameworkPackages
SymfonyPhoneNumberBundle
LaravelLaravel Phone
Yii2PhoneInput
KohanaPhoneNumber
TYPO3TYPO3 Phone Extension

These packages are supplied by third parties, and their quality can not be guaranteed.