22.042015

Telefonnummern einfach parsen, formatieren und validieren

Telefonnummern können ganz verschiedene Formate annehmen und diese können von Land zu Land auch noch sehr unterschiedlich sein. Daher sollte man immer wenn der User eine Telefonnummer eingibt diese validieren und in ein einheitliches Format bringen und in diesem abspeichern. Google stellt dafür eine umfangreiche Library namens libphonenumber für Java, C++ und JavaScript zur Verfügung. Glücklicherweise gibt es davon abgeleitete Projekte für viele weitere Programmiersprachen, unter anderem PHP.

Die entsprechende Library für PHP heißt einfach libphonenumber-for-php und ist auf GitHub zu finden.

Die Verwendung der Bibliothek ist angenehm einfach. Nehmen wir an, wir haben eine Telefonnummer aus der Schweiz. Diese können wir wie folgt parsen und normalisieren:

$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);
}

Jetzt können wir die Nummer ganz einfach validieren:

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

Und das Formatieren funktioniert genauso einfach:

// 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);

Ihr seht also die Library ist genau das Richtige, wenn ihr in eurer Webanwendung internationale Telefonnummern handeln wollt. Es gibt noch viele weitere Features, wie Kurzwahlen (zum Beispiel für Notrufe), Mappings zu Telefonanbietern, Mappings zu Zeitzonen (praktisch wenn man jemanden im betroffenen Land anrufen möchte) und vieles mehr.

Um die Library schnell aus zu probieren gibt es auch eine Online Demo.