Jag hade ett behov av att normalisera telefonnummer i en lista som var ifyllda av användare, så dom såg lite hur som helst ut. Så jag skrev en funktion för att normalisera telefonnummer som ser ut så här:
function phone_number($nr, $formats = false){ if (empty($GLOBALS["areacodes"])){ if (file_exists("$GLOBALS[data_dir]/Atlas/Areacodes/$GLOBALS[language].txt")){ $GLOBALS["areacodes"] = array_filter(explode("\n", file_get_contents("$GLOBALS[data_dir]/Atlas/Areacodes/$GLOBALS[language].txt"))); } } if ($formats === true){ $number = preg_replace("/[^\d\+]/", "", $nr); if (preg_match("/^00/", $number)){ $number = preg_replace("/^00/", "+", $number); } elseif (preg_match("/^0[1-9]/", $number)) { switch ($GLOBALS["language"]){ case "se": $number = "+46" . preg_replace("/^0/", "", $number); break; } } return $number; } if (!$formats) $formats = ["### ##", "## ## ##", "### ## ##", "### ### ##"]; if (!empty($GLOBALS["phone_formats"])) $formats = explode("\n", $GLOBALS["phone_formats"]); $country = false; if (!empty($GLOBALS["areacodes"])){ if (preg_match("/^\+(\d{2})/", $nr, $m)){ $country = "+" . $m[1]; if ($m[1] == 46 && $GLOBALS["language"] == "se"){ $country = false; $nr = preg_replace("/^\+46/", "0", $nr); } else { $nr = preg_replace("/^\+\d{2}/", "", $nr); } } $number = preg_replace("/[^\d\+]/", "", $nr); $cd = join("|", $GLOBALS["areacodes"]); if (preg_match("/^($cd)(.*)$/", $number, $m)){ $digits = preg_split("//", $m[2], -1, PREG_SPLIT_NO_EMPTY); $numlen = count($digits); foreach ($formats as $f){ $charnum = substr_count($f, "#"); if ($charnum == $numlen){ $lnr = 0; foreach (preg_split("//", $f, -1, PREG_SPLIT_NO_EMPTY) as $c){ if ($c == "#"){ $out[] = $digits[$lnr]; $lnr++; } else { $out[] = $c; } } if (!empty($out)){ return $country . $m[1] . "-" . trim(join("", $out)); } } } } } return $country . $nr; }
Så, först så kan man skicka med en array med de format man vill använda, annars så har funktionen en uppsättning med format. Dessa format gäller numret efter riktnumret, så en fil med riktnummer krävs också. Funktionen laddar en fil med det språkval som sidan i fråga har, så man får rätt lands riktnummer. Det är en lista med giltiga riktnummer, en per rad.
Sedan matchar vi numret med ett giltigt riktnummer och om det finns så går vi igenom formaten och ställer upp siffrorna efter hash-tecknena, så "0701234567" + "### ## ##" blir "070-123 45 67", behändigt!