StackOverflow 全体を通して、電話番号をさまざまな方法で処理する多くのコードのチャンクがあります。
それらのほとんどは、米国の電話番号形式を使用しています。一部の英国の番号に使用できるものもいくつかありますが、すべてが正しい結果を生成するわけではありません.
以下のコードは、英国の電話番号を次のようにフォーマットします。
03、08、および 09 で始まる非地理的な番号は、0xxx xxx xxxx および +44 xxx xxx xxxx としてフォーマットされます。
07 で始まる携帯電話番号は、07xxx xxxxxx および +44 7xxx xxxxxx としてフォーマットされます。
VoIP およびその他の 05 番号は、05xxx xxxxxx および +44 5xxx xxxxxx としてフォーマットされます。
01 と 02 で始まる番号は地理的な番号です。これらは、可変長の市外局番を持っています。正確性を確保するために、www.ofcom.org.uk/static/numbering/sabc.txt および www.ofcom.org.uk/static/numbering/codelist.zip で公開されている最新の Ofcom 仕様が使用されています。
Ofcom リスト 0113/0114/0115/0116/0117/0118 および 0121/0141 は 3 桁のエリア コードを持ち、015242、013873、015394/015395/015396、016973/016974、017683/017684/01768 は 6 を持ち、01768数字の市外局番。残りは 4 桁の市外局番を使用します。0171 と 0181 はロンドンの 3 桁の市外局番でしたが、現在は使用されていません。
PHP コードは、含まれているシンプルなフォームベースの入力で簡単にテストできます。コードが他の方法で使用されている場合は、フォームを破棄できます。
入力は、最初に先頭の国際アクセス コードと国コードの数字が取り除かれます。スペースや句読点などの不要な文字、および存在する場合はトランクの数字を削除した後、番号の長さがチェックされ、10 桁の長さで有効な範囲内にあることが確認されます。数値は、少数の単純なルール セットを使用してフォーマットされます。
「ext. 234」または「x 234」の形式で追加された内線番号の基本サポートも含まれています。
最終的なアウトプットは、国内および国際的な形式で提示されます。
このコードは、非標準の番号 0800 1111 および 0845 4647 を考慮していません。これらは 7 桁しかないという点で珍しいものです。
<?php
// format UK telephone numbers using Ofcom specifications
// www.ofcom.org.uk/static/numbering/sabc.txt
// www.ofcom.org.uk/static/numbering/codelist.zip
// parse submitted form variables
if (ISSET($_POST['tel_form']) && ($_POST['tel_form'] == "1")) {
if (ISSET($_POST['tel_num'])) {
$tel_num = $_POST['tel_num'];
$text = ' <p><b>Number as input:</b> ' . $tel_num . "</p>\n";
// remove leading +44, 00 44, 011 44 if present
$leadingPattern = '/^(\+|00|011)?\ ?44(.*)/';
if (preg_match($leadingPattern, $tel_num, $leadingMatches)) {
$tel_num = $leadingMatches[2];
}
// remove and separately store any extension number
$extPattern = '/((ext|x)(.*))/';
if (preg_match($extPattern, $tel_num, $extMatches)) {
$extension = $extMatches[1];
}
$extReplacements = '';
$tel_num = preg_replace($extPattern, $extReplacements, $tel_num);
// remove all non-digit characters and punctuation
$nonDigitPattern = '([^0-9]+)';
$nonDigitReplacements = '';
$tel_num = preg_replace($nonDigitPattern, $nonDigitReplacements, $tel_num);
$extension = preg_replace($nonDigitPattern, $nonDigitReplacements, $extension);
// remove leading 0 if present
$leadingZeroPattern = '/^0+(.*)/';
if (preg_match($leadingZeroPattern, $tel_num, $leadingZeroMatches)) {
$tel_num = $leadingZeroMatches[1];
}
// check remaining number length is 10 digits long
if (strlen($tel_num) < '10') {
$text .= ' <p>' . 'Telephone number too short.' . "</p>\n";
}
elseif (strlen($tel_num) > '10') {
$text .= ' <p>' . 'Telephone number too long.' . "</p>\n";
}
// format valid numbers
else {
// format 3 digit area code for 0113/4/5/6/7/8, 0121, 0141
$length3pattern = '/^(1(1[345678]|[24]1))([0-9]{3})(.*)/';
if (preg_match($length3pattern, $tel_num, $matches)) {
$formatted_number = $matches[1] . ' ' . $matches[3] . ' ' . $matches[4];
}
// format 5 digit area code for 015242, 013873, 015394/5/6, 016973/4, 017683/4/7, 019467
$length5pattern = '/^(1(3873|5242|539[456]|697[34]|768[347]|9467))(.*)/';
if (preg_match($length5pattern, $tel_num, $matches)) {
$formatted_number = $matches[1] . ' ' . $matches[3];
}
// format non-geographic numbers
$NGNpattern = '/^([389][0-9]{2})([0-9]{3})(.*)/';
if (preg_match($NGNpattern, $tel_num, $matches)) {
$formatted_number = $matches[1] . ' ' . $matches[2] . ' ' . $matches[3];
}
// format all other numbers
if (!ISSET($formatted_number)) {
$pattern = '/^([1257][0-9]{3})(.*)/';
if (preg_match($pattern, $tel_num, $matches)) {
$formatted_number = $matches[1] . ' ' . $matches[2];
}
// else warn that number isn't valid
else {
$text .= " <p>Telephone number probably not valid.</p>\n";
}
}
// store number in international and national formats
}
if (ISSET($formatted_number)) {
$int_formatted_number = '+44 ' . $formatted_number;
$text .= ' <p><b>International format:</b> ' . $int_formatted_number . "</p>\n";
$codePattern = '/^([12][^\ ]+)(\ .*)/';
if (preg_match($codePattern, $formatted_number, $matches)) {
$nat_formatted_number = '(0' . $matches[1] . ') ' . $matches[2];
}
else {
$nat_formatted_number = '0' . $formatted_number;
}
$text .= ' <p><b>National format:</b> ' . $nat_formatted_number . "</p>\n";
if ((ISSET($extension)) && (!empty($extension))) {
$text .= ' <p><b>Extension:</b> ' . $extension . "</p>\n";
}
}
// show start message for first time form use
}
}
else {
$text = " <p><b>Please start by entering a UK telephone number.</b></p>\n";
}
// show HTML page with form for input
?>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>UK telephone number formatter</title>
</head>
<body>
<?php
if (ISSET($text)) {
print $text;
}
?>
<hr>
<?php
if ((ISSET($tel_num)) && (!empty($tel_num))) {
$tel_num = '0' . $tel_num;
}
?>
<form action="telnum.php" name="input" method="post">
<p><b>Enter a UK telephone number to format:</b> <input type="text" name="tel_num" value="<?php print $tel_num; ?>" />
<input type="hidden" name="tel_form" value="1" />
<input type="submit" value="submit" /></p>
</form>
</body>
</html>