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
- Parsing a phone number:
use libphonenumber\PhoneNumberUtil;
$phoneUtil = PhoneNumberUtil::getInstance();
$phoneNumber = $phoneUtil->parse("+44 20 7031 3000", "GB");
- Formatting a phone number:
use libphonenumber\PhoneNumberFormat;
$formattedNumber = $phoneUtil->format($phoneNumber, PhoneNumberFormat::INTERNATIONAL);
echo $formattedNumber; // +44 20 7031 3000
- Validating a phone number:
$isValid = $phoneUtil->isValidNumber($phoneNumber);
echo $isValid ? "Valid" : "Invalid";
- Getting the type of a phone number:
use libphonenumber\PhoneNumberType;
$numberType = $phoneUtil->getNumberType($phoneNumber);
echo PhoneNumberType::values()[$numberType]; // FIXED_LINE
Getting Started
- Install the library using Composer:
composer require giggsey/libphonenumber-for-php
- 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 designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
libphonenumber for PHP
What is it?
A PHP library for parsing, formatting, storing and validating international phone numbers. This library is based on Google's libphonenumber.
- Installation
- Documentation
- Online Demo
- Highlights of functionality
- FAQ
- Generating data
- Integration with frameworks
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
- PhoneNumber Util
- ShortNumber Info
- Phone Number Geolocation
- Phone Number to Carrier Mapping
- Phone Number to Timezone Mapping
- Phone Number Matcher
- As You Type Formatter
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.
Framework | Packages |
---|---|
Symfony | PhoneNumberBundle |
Laravel | Laravel Phone |
Yii2 | PhoneInput |
Kohana | PhoneNumber |
TYPO3 | TYPO3 Phone Extension |
These packages are supplied by third parties, and their quality can not be guaranteed.
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
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot