PHP에서 전화 번호 서식 지정


101

SMS 앱을 작업 중이며 보낸 사람의 전화 번호를 +11234567890 에서 123-456-7890 으로 변환 할 수 있어야 MySQL 데이터베이스의 레코드와 비교할 수 있습니다 .

번호는 사이트의 다른 곳에서 사용하기 위해 후자의 형식으로 저장되며 많은 코드를 수정해야하므로 형식을 변경하지 않을 것입니다.

PHP로 어떻게해야합니까?

감사!


13
ahhhhh .... NOOOO .... 왜 이렇게 전화 번호를 저장하는거야!? 문자열로? 나쁘다 나쁘다 나쁘다! 당신은 큰의 int로 저장해야합니다 ... 적은 저장 빠르게 정렬, 필요한 빠른 색인
sethvargo

7
전화 번호를 문자열로 저장하는 데는 그다지 문제가되지 않습니다 (+61 (0) 812345678을 저장해야 할 때 피할 수 없음)-그러나 특정 형식을 저장하는 것은 약간 이상합니다 (즉, 구분자)-형식을 지정하는 것이 가장 좋습니다. 데이터 레이어가 아닌 프레젠테이션 레이어에서.
HorusKol 2011 년

3
@NightMICU - 100 %에게 그렇게 할 수있는 길을 잘못입니다 ... 당신은 정수로 저장 및 재사용 기능을 가지고해야한다고 표시 형식
sethvargo

227
저장 공간을 절약하기 위해 전화 번호를 정수로 저장하는 것은 끔찍한 생각입니다. 전화 번호는 일반적인 의미에서 수학을 할 수있는 숫자가 아닙니다. 숫자가 0으로 시작할 수있는 미국 특정 형식 이외의 숫자를 저장해야하는 순간 문제가 발생합니다. 이 정보를 문자열로 저장하는 것이 좋습니다.
Charles Sprayberry

2
@NightMICU 훌륭한 Jon Skeet조차도 문자열로 저장하는 것에 대해 기분이 나아지면 선행 0 문제에 대해 정수로 저장하지 말라고 말합니다. stackoverflow.com/a/3483166/746010
Charles Sprayberry

답변:


108
$data = '+11234567890';

if(  preg_match( '/^\+\d(\d{3})(\d{3})(\d{4})$/', $data,  $matches ) )
{
    $result = $matches[1] . '-' .$matches[2] . '-' . $matches[3];
    return $result;
}

가능한 공백 및 기타 형식의 국제 번호를 캡처하려면 : / ^ (\ +? \ d {1,2}?) [.-]? (? (\ d {3}))? [.-]? (\ d {3}) [.-]? (\ d {4}) $ /
TeckniX

3
@stoutie 당신이 틀 렸습니다. $ matches [0]은 전체 일치 패턴 텍스트입니다. 그런 다음 사용하기 전에 array_shift ($ matches)해야합니다.
Alexandre Reis Ribeiro

출력시 포맷하는 것이 더 빠를까요? 사용 sprintf또는`printf``? 누군가 나에게 설명해주세요. 나는 미국 전화 번호로만 작업하고 있으며 하위 문자열을 사용하여 출력 기능을 통해 실행하는 것이 가장 좋은 방법이라고 생각하지 않습니다.
Rafael

댓글에 반대표를 포함해야한다고 생각합니다. @Stoutie의 댓글이 오해의 소지가 있습니다.
peterchaula dec.

1
수년 전에 잘못된 댓글을 올리는 어린 시절, TDD 이전 날에 대해 사과드립니다. 앞으로 더 잘할 것을 약속드립니다. 참조하신 댓글이 삭제 된 것 같습니다. 모든 것이 좋습니다. 즐거운 휴일 보내세요.
Stoutie

163

이것은 현재 답변보다 더 많은 버전의 번호에서 작동하는 미국 전화 포맷터입니다.

$numbers = explode("\n", '(111) 222-3333
((111) 222-3333
1112223333
111 222-3333
111-222-3333
(111)2223333
+11234567890
    1-8002353551
    123-456-7890   -Hello!
+1 - 1234567890 
');


foreach($numbers as $number)
{
    print preg_replace('~.*(\d{3})[^\d]{0,7}(\d{3})[^\d]{0,7}(\d{4}).*~', '($1) $2-$3', $number). "\n";
}

다음은 정규식의 분석입니다.

Cell: +1 999-(555 0001)

.*          zero or more of anything "Cell: +1 "
(\d{3})     three digits "999"
[^\d]{0,7}  zero or up to 7 of something not a digit "-("
(\d{3})     three digits "555"
[^\d]{0,7}  zero or up to 7 of something not a digit " "
(\d{4})     four digits "0001"
.*          zero or more of anything ")"

업데이트 : 2015 년 3 월 11 일 {0,7}대신{,7}


전화 번호에 내선 번호가 있으면 어떻게합니까?
SpYk3HH

1
좋은 점-확장 프로그램이 전 세계적으로 어떻게 보이는지에 대한 몇 가지 예가 있습니까? Proabaly 같은 ~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4})(?:[ \D#\-]*(\d{3,6}))?.*~.
Xeoncross

1
내 웹 사이트 사용자가 지역 번호를 생략 한 경우 어떻게됩니까?
skibulk 2014

정규식의 다양한 부분이 수행하는 작업에 대한 분석을 얻을 수 있습니까 (아래 다른 답변에서 볼 수 있음)? 즉 : (\d{3}) // 3 digits [\d]// 숫자가 아닌 문자
roberthuttinger 2014 년

1
@WesleyMurch 이제 {,7}업데이트 해야하는 정규식 일치가 변경된 것 같습니다 {0,7}. 코드를 업데이트했습니다.
Xeoncross

55

이 기능은 국제 (10 자리 이상), 비 국제 (10 자리) 또는 구식 (7 자리) 전화 번호를 포맷합니다. 10+, 10 또는 7 자리 이외의 숫자는 서식이 지정되지 않은 상태로 유지됩니다.

function formatPhoneNumber($phoneNumber) {
    $phoneNumber = preg_replace('/[^0-9]/','',$phoneNumber);

    if(strlen($phoneNumber) > 10) {
        $countryCode = substr($phoneNumber, 0, strlen($phoneNumber)-10);
        $areaCode = substr($phoneNumber, -10, 3);
        $nextThree = substr($phoneNumber, -7, 3);
        $lastFour = substr($phoneNumber, -4, 4);

        $phoneNumber = '+'.$countryCode.' ('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 10) {
        $areaCode = substr($phoneNumber, 0, 3);
        $nextThree = substr($phoneNumber, 3, 3);
        $lastFour = substr($phoneNumber, 6, 4);

        $phoneNumber = '('.$areaCode.') '.$nextThree.'-'.$lastFour;
    }
    else if(strlen($phoneNumber) == 7) {
        $nextThree = substr($phoneNumber, 0, 3);
        $lastFour = substr($phoneNumber, 3, 4);

        $phoneNumber = $nextThree.'-'.$lastFour;
    }

    return $phoneNumber;
}

이것은 훌륭하지만 지역 번호 주위의 괄호는 선택적 숫자를 의미한다는 점을 지적하고 싶습니다. 대부분의 관할 지역에서는 더 이상 지역 번호를 선택 사항으로 간주하지 않으므로 간단한 하이픈으로 구분하는 것이 더 정확합니다.
Vincent

30

전화 번호가 항상 정확한 형식이라고 가정하면 다음 스 니펫을 사용할 수 있습니다.

$from = "+11234567890";
$to = sprintf("%s-%s-%s",
              substr($from, 2, 3),
              substr($from, 5, 3),
              substr($from, 8));

그냥 $ to var를 에코 해주세요. 좋아요.
Samuel Ramzan

22

전화 번호는 어렵습니다. 보다 강력하고 국제적인 솔루션을 위해 Google의 libphonenumber 라이브러리 의 잘 관리 된 PHP 포트권장 합니다.

이렇게 사용하면

use libphonenumber\NumberParseException;
use libphonenumber\PhoneNumber;
use libphonenumber\PhoneNumberFormat;
use libphonenumber\PhoneNumberUtil;

$phoneUtil = PhoneNumberUtil::getInstance();

$numberString = "+12123456789";

try {
    $numberPrototype = $phoneUtil->parse($numberString, "US");

    echo "Input: " .          $numberString . "\n";
    echo "isValid: " .       ($phoneUtil->isValidNumber($numberPrototype) ? "true" : "false") . "\n";
    echo "E164: " .           $phoneUtil->format($numberPrototype, PhoneNumberFormat::E164) . "\n";
    echo "National: " .       $phoneUtil->format($numberPrototype, PhoneNumberFormat::NATIONAL) . "\n";
    echo "International: " .  $phoneUtil->format($numberPrototype, PhoneNumberFormat::INTERNATIONAL) . "\n";
} catch (NumberParseException $e) {
    // handle any errors
}

다음과 같은 출력이 표시됩니다.

Input: +12123456789
isValid: true
E164: +12123456789
National: (212) 345-6789
International: +1 212-345-6789

E164중복 확인을 위해 형식을 사용하는 것이 좋습니다 . 또한 번호가 실제 휴대폰 번호인지 (사용 PhoneNumberUtil::getNumberType()) 또는 미국 번호 (사용 PhoneNumberUtil::getRegionCodeForNumber())인지 확인할 수도 있습니다.

보너스로 라이브러리는 거의 모든 입력을 처리 할 수 ​​있습니다. 예를 들어 1-800-JETBLUE위의 코드 를 실행하도록 선택 하면

Input: 1-800-JETBLUE
isValid: true
E164: +18005382583
National: (800) 538-2583
International: +1 800-538-2583

Neato.

미국 이외의 국가에서도 잘 작동합니다. parse()인수 에 다른 ISO 국가 코드를 사용하십시오 .


2
훌륭한 라이브러리이지만 37MB 및 1500 개의 파일입니다! 제 경우에는 형식을 지정할 전화 번호 수가 제한되어 있으므로 number_formatted데이터베이스에 열을 추가 하고 형식이 지정된 번호를 수동으로 입력 하기로 결정했습니다 . 그래도 libphonenumber서식이 지정된 숫자를 생성하기 위해 로컬에서 여전히 사용 하지만 내 작은 프로젝트에 이러한 거대한 라이브러리를 포함하는 것은 과잉입니다.
Magnus W

9

지역 코드를 선택적 구성 요소로 사용하고 확장에 필요한 구분 기호 및 정규식 주석을 사용하는 미국 전용 솔루션은 다음과 같습니다.

function formatPhoneNumber($s) {
$rx = "/
    (1)?\D*     # optional country code
    (\d{3})?\D* # optional area code
    (\d{3})\D*  # first three
    (\d{4})     # last four
    (?:\D+|$)   # extension delimiter or EOL
    (\d*)       # optional extension
/x";
preg_match($rx, $s, $matches);
if(!isset($matches[0])) return false;

$country = $matches[1];
$area = $matches[2];
$three = $matches[3];
$four = $matches[4];
$ext = $matches[5];

$out = "$three-$four";
if(!empty($area)) $out = "$area-$out";
if(!empty($country)) $out = "+$country-$out";
if(!empty($ext)) $out .= "x$ext";

// check that no digits were truncated
// if (preg_replace('/\D/', '', $s) != preg_replace('/\D/', '', $out)) return false;
return $out;
}

다음은이를 테스트하는 스크립트입니다.

$numbers = [
'3334444',
'2223334444',
'12223334444',
'12223334444x5555',
'333-4444',
'(222)333-4444',
'+1 222-333-4444',
'1-222-333-4444ext555',
'cell: (222) 333-4444',
'(222) 333-4444 (cell)',
];

foreach($numbers as $number) {
    print(formatPhoneNumber($number)."<br>\r\n");
}

5

다음은 유럽 (또는 스웨덴어?) 방식으로 7 ~ 10 자리 전화 번호 형식을 지정하는 간단한 기능입니다.

function formatPhone($num) {
    $num = preg_replace('/[^0-9]/', '', $num);
    $len = strlen($num);

    if($len == 7) $num = preg_replace('/([0-9]{2})([0-9]{2})([0-9]{3})/', '$1 $2 $3', $num);
    elseif($len == 8) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{3})/', '$1 - $2 $3', $num);
    elseif($len == 9) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{2})([0-9]{2})/', '$1 - $2 $3 $4', $num);
    elseif($len == 10) $num = preg_replace('/([0-9]{3})([0-9]{2})([0-9]{2})([0-9]{3})/', '$1 - $2 $3 $4', $num);

    return $num;
}

5

바퀴를 재발 명하지 마십시오! 이 놀라운 라이브러리 가져 오기 :
https://github.com/giggsey/libphonenumber-for-php

$defaultCountry = 'SE'; // Based on the country of the user
$phoneUtil = PhoneNumberUtil::getInstance();
$swissNumberProto = $phoneUtil->parse($phoneNumber, $defaultCountry);

return $phoneUtil->format($swissNumberProto, PhoneNumberFormat::INTERNATIONAL);

국제 전화 번호를 구문 분석, 서식 지정 및 확인하기위한 Google의 라이브러리를 기반으로합니다 : https://github.com/google/libphonenumber


3
이것이 유효한 대답이라고 생각하지만 Stack Overflow 표준에 따라 유용하게 사용하려면 링크를 공유하는 대신 라이브러리를 사용하여 OP의 문제를 해결하는 예제를 포함하도록 편집해야합니다.
Alecg_O

1
@Alecg_O 감사합니다! 예를 추가했습니다.
Viktor Jarnheimer 19.11.

4

일부 정규식 또는 몇 가지 substr 호출을 사용하여 이것이 가능하다는 것을 알았습니다 (입력이 항상 해당 형식이고 길이 등을 변경하지 않는다고 가정).

같은 것

$in = "+11234567890"; $output = substr($in,2,3)."-".substr($in,6,3)."-".substr($in,10,4);

해야합니다.


4

RegEx보다 빠릅니다.

$input = "0987654321"; 

$output = substr($input, -10, -7) . "-" . substr($input, -7, -4) . "-" . substr($input, -4); 
echo $output;

1
짧고 달콤한 (y).
rahim.nagori

2

다음과 같이 시도하십시오.

preg_replace('/\d{3}/', '$0-', str_replace('.', null, trim($number)), 2);

이것은 달러 (A $) 번호를 취할 것입니다 8881112222및 변환 888-111-2222. 도움이 되었기를 바랍니다.


1
제안 출처 : hotscripts.com/forums/php/36805-php-format-phone-numbers.html . 의 str_replace도로 '.'업데이트 '-'하거나 제거해야합니다. 특정 사용 사례가 직면했기 때문에 포함되었습니다. 아주 적은 노력으로 그것을 변환 preg_replace('/\d{3}/', '$0-', substr($number, 2))하고 질문에 직접 답할 수있었습니다.
Iiridayn

2

또 다른 옵션-구성에서 형식을 수신하도록 쉽게 업데이트됩니다.

$numbers = explode("\n", '(111) 222-3333
((111) 222-3333
1112223333
111 222-3333
111-222-3333
(111)2223333
+11234567890
    1-8002353551
    123-456-7890   -Hello!
+1 - 1234567890
');
foreach( $numbers AS $number ){
  echo comMember_format::phoneNumber($number) . '<br>';
}

// ************************************************************************
// Format Phone Number
public function phoneNumber( $number ){
  $txt = preg_replace('/[\s\-|\.|\(|\)]/','',$number);
  $format = '[$1?$1 :][$2?($2):x][$3: ]$4[$5: ]$6[$7? $7:]';
  if( preg_match('/^(.*)(\d{3})([^\d]*)(\d{3})([^\d]*)(\d{4})([^\d]{0,1}.*)$/', $txt, $matches) ){
    $result = $format;
    foreach( $matches AS $k => $v ){
      $str = preg_match('/\[\$'.$k.'\?(.*?)\:(.*?)\]|\[\$'.$k.'\:(.*?)\]|(\$'.$k.'){1}/', $format, $filterMatch);
      if( $filterMatch ){
        $result = str_replace( $filterMatch[0], (!isset($filterMatch[3]) ? (strlen($v) ? str_replace( '$'.$k, $v, $filterMatch[1] ) : $filterMatch[2]) : (strlen($v) ? $v : (isset($filterMatch[4]) ? '' : (isset($filterMatch[3]) ? $filterMatch[3] : '')))), $result );
      }
    }
    return $result;
  }
  return $number;
}

1

모두,

내가 고친 것 같아요. 현재 입력 파일에 대해 작업하고이 작업을 수행하려면 다음 두 가지 기능이 있습니다!

function format_phone_number :

        function format_phone_number ( $mynum, $mask ) {
        /*********************************************************************/
        /*   Purpose: Return either masked phone number or false             */
        /*     Masks: Val=1 or xxx xxx xxxx                                             */
        /*            Val=2 or xxx xxx.xxxx                                             */
        /*            Val=3 or xxx.xxx.xxxx                                             */
        /*            Val=4 or (xxx) xxx xxxx                                           */
        /*            Val=5 or (xxx) xxx.xxxx                                           */
        /*            Val=6 or (xxx).xxx.xxxx                                           */
        /*            Val=7 or (xxx) xxx-xxxx                                           */
        /*            Val=8 or (xxx)-xxx-xxxx                                           */
        /*********************************************************************/         
        $val_num        = self::validate_phone_number ( $mynum );
        if ( !$val_num && !is_string ( $mynum ) ) { 
            echo "Number $mynum is not a valid phone number! \n";
            return false;
        }   // end if !$val_num
        if ( ( $mask == 1 ) || ( $mask == 'xxx xxx xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1 $2 $3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 1
        if ( ( $mask == 2 ) || ( $mask == 'xxx xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1 $2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 2
        if ( ( $mask == 3 ) || ( $mask == 'xxx.xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '$1.$2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 3
        if ( ( $mask == 4 ) || ( $mask == '(xxx) xxx xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2 $3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 4
        if ( ( $mask == 5 ) || ( $mask == '(xxx) xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 5
        if ( ( $mask == 6 ) || ( $mask == '(xxx).xxx.xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1).$2.$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 6
        if ( ( $mask == 7 ) || ( $mask == '(xxx) xxx-xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1) $2-$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 7
        if ( ( $mask == 8 ) || ( $mask == '(xxx)-xxx-xxxx' ) ) { 
            $phone = preg_replace('~.*(\d{3})[^\d]*(\d{3})[^\d]*(\d{4}).*~', 
                    '($1)-$2-$3'." \n", $mynum);
            return $phone;
        }   // end if $mask == 8
        return false;       // Returns false if no conditions meet or input
    }  // end function format_phone_number

함수 validate_phone_number :

        function validate_phone_number ( $phone ) {
        /*********************************************************************/
        /*   Purpose:   To determine if the passed string is a valid phone  */
        /*              number following one of the establish formatting        */
        /*                  styles for phone numbers.  This function also breaks    */
        /*                  a valid number into it's respective components of:      */
        /*                          3-digit area code,                                      */
        /*                          3-digit exchange code,                                  */
        /*                          4-digit subscriber number                               */
        /*                  and validates the number against 10 digit US NANPA  */
        /*                  guidelines.                                                         */
        /*********************************************************************/         
        $format_pattern =   '/^(?:(?:\((?=\d{3}\)))?(\d{3})(?:(?<=\(\d{3})\))'.
                                    '?[\s.\/-]?)?(\d{3})[\s\.\/-]?(\d{4})\s?(?:(?:(?:'.
                                    '(?:e|x|ex|ext)\.?\:?|extension\:?)\s?)(?=\d+)'.
                                    '(\d+))?$/';
        $nanpa_pattern      =   '/^(?:1)?(?(?!(37|96))[2-9][0-8][0-9](?<!(11)))?'.
                                    '[2-9][0-9]{2}(?<!(11))[0-9]{4}(?<!(555(01([0-9]'.
                                    '[0-9])|1212)))$/';

        // Init array of variables to false
        $valid = array('format' =>  false,
                            'nanpa' => false,
                            'ext'       => false,
                            'all'       => false);

        //Check data against the format analyzer
        if ( preg_match ( $format_pattern, $phone, $matchset ) ) {
            $valid['format'] = true;    
        }

        //If formatted properly, continue
        //if($valid['format']) {
        if ( !$valid['format'] ) {
            return false;
        } else {
            //Set array of new components
            $components =   array ( 'ac' => $matchset[1], //area code
                                                            'xc' => $matchset[2], //exchange code
                                                            'sn' => $matchset[3] //subscriber number
                                                            );
            //              $components =   array ( 'ac' => $matchset[1], //area code
            //                                              'xc' => $matchset[2], //exchange code
            //                                              'sn' => $matchset[3], //subscriber number
            //                                              'xn' => $matchset[4] //extension number             
            //                                              );

            //Set array of number variants
            $numbers    =   array ( 'original' => $matchset[0],
                                        'stripped' => substr(preg_replace('[\D]', '', $matchset[0]), 0, 10)
                                        );

            //Now let's check the first ten digits against NANPA standards
            if(preg_match($nanpa_pattern, $numbers['stripped'])) {
                $valid['nanpa'] = true;
            }

            //If the NANPA guidelines have been met, continue
            if ( $valid['nanpa'] ) {
                if ( !empty ( $components['xn'] ) ) {
                    if ( preg_match ( '/^[\d]{1,6}$/', $components['xn'] ) ) {
                        $valid['ext'] = true;
                    }   // end if if preg_match 
                } else {
                    $valid['ext'] = true;
                }   // end if if  !empty
            }   // end if $valid nanpa

            //If the extension number is valid or non-existent, continue
            if ( $valid['ext'] ) {
                $valid['all'] = true;
            }   // end if $valid ext
        }   // end if $valid
        return $valid['all'];
    }   // end functon validate_phone_number

lib 클래스에이 기능이 있으므로 첫 번째 함수 / 메서드에서 "self :: validate_phone_number"호출이 수행됩니다.

다음을 추가 한 "validate_phone_number"함수의 32 행에 주목하십시오.

            if ( !$valid['format'] ) {
            return false;
        } else {

전화 번호가 유효하지 않은 경우 허위 신고가 필요합니다.

더 많은 데이터에 대해 이것을 테스트해야하지만 현재 형식으로 현재 데이터에서 작업하고 있으며이 특정 데이터 배치에 대해 스타일 '8'을 사용하고 있습니다.

또한 지속적으로 오류가 발생하면서 "확장"로직에 대해 주석을 달았는데, 데이터에 해당 정보가 없음을 알았습니다.


1

이것은 7, 10 및 11 자리를 취하고 추가 문자를 제거하고 문자열을 오른쪽에서 왼쪽으로 이동하여 대시를 추가합니다. 대시를 공백이나 점으로 변경합니다.

$raw_phone = preg_replace('/\D/', '', $raw_phone);
$temp = str_split($raw_phone);
$phone_number = "";
for ($x=count($temp)-1;$x>=0;$x--) {
    if ($x === count($temp) - 5 || $x === count($temp) - 8 || $x === count($temp) - 11) {
        $phone_number = "-" . $phone_number;
    }
    $phone_number = $temp[$x] . $phone_number;
}
echo $phone_number;

1

OP가 123-456-7890 형식을 요청한다는 것을 알고 있지만 John Dul의 답변 에 따라 전화 번호를 괄호 형식으로 반환하도록 수정했습니다 (예 : (123) 456-7890). 이것은 7 자리와 10 자리 숫자 만 처리합니다.

function format_phone_string( $raw_number ) {

    // remove everything but numbers
    $raw_number = preg_replace( '/\D/', '', $raw_number );

    // split each number into an array
    $arr_number = str_split($raw_number);

    // add a dummy value to the beginning of the array
    array_unshift( $arr_number, 'dummy' );

    // remove the dummy value so now the array keys start at 1
    unset($arr_number[0]);

    // get the number of numbers in the number
    $num_number = count($arr_number);

    // loop through each number backward starting at the end
    for ( $x = $num_number; $x >= 0; $x-- ) {

        if ( $x === $num_number - 4 ) {
            // before the fourth to last number

            $phone_number = "-" . $phone_number;
        }
        else if ( $x === $num_number - 7 && $num_number > 7 ) {
            // before the seventh to last number
            // and only if the number is more than 7 digits

            $phone_number = ") " . $phone_number;
        }
        else if ( $x === $num_number - 10 ) {
            // before the tenth to last number

            $phone_number = "(" . $phone_number;
        }

        // concatenate each number (possibly with modifications) back on
        $phone_number = $arr_number[$x] . $phone_number;
    }

    return $phone_number;
}

1

내 의견은 다음과 같습니다.

$phone='+11234567890';
$parts=sscanf($phone,'%2c%3c%3c%4c');
print "$parts[1]-$parts[2]-$parts[3]";

//  123-456-7890

sscanf함수는 첫 번째 문자열에서 문자를 해석하는 방법을 알려주는 형식 문자열을 두 번째 매개 변수로 사용합니다. 이 경우 2 자 ( %2c), 3 자, 3 자, 4자를 의미합니다.

일반적으로 sscanf함수에는 추출 된 데이터를 캡처하기위한 변수도 포함됩니다. 그렇지 않은 경우 데이터는 내가 호출 한 배열로 반환됩니다 $parts.

print문은 보간 된 문자열을 출력합니다. $part[0]무시됩니다.

유사한 기능을 사용하여 호주 전화 번호 형식을 지정했습니다.

전화 번호 저장의 관점에서 볼 때 :

  • 전화 번호는 문자열입니다.
  • 저장된 데이터 에는 공백이나 하이픈과 같은 서식이 포함 되지 않아야합니다.

이것은 가장 우아하고 읽기 쉬운 솔루션입니다. 키스. 입력 문자열이 항상 똑같은 패턴을 따르는 경우 더 이상 스크롤하지 마십시오. 이 추가에 감사드립니다.
Musa

1

영국 전화 형식

제가 개발 한 애플리케이션의 경우 사람이 읽을 수있는 형식으로 전화 번호를 '올바르게'입력했지만 '-' '/' '+44'등과 같은 다양한 임의의 문자를 삽입하는 것을 발견했습니다. 문제는 클라우드 앱이 대화가 필요한 것은 형식에 대해 매우 구체적이었습니다. 정규식을 사용하는 대신 (사용자에게는 실망 스러울 수 있음) 입력 된 숫자를 지속성 모듈에서 처리하기 전에 올바른 형식으로 처리하는 객체 클래스를 만들었습니다.

출력의 형식은 모든 수신 소프트웨어가 출력을 정수가 아닌 텍스트로 해석하고 (즉시 선행 0이 손실 됨) 형식이 British Telecoms 와 일치하도록합니다. 숫자 형식에 대한 지침-긴 숫자를 작고 쉽게 기억할 수있는 그룹으로 나누어 사람의 기억력을 향상시킵니다.


+441234567890 생성 (01234)
567890 02012345678 생성 (020) 1234 5678
1923123456 생성 (01923)
123456 01923123456 생성 (01923)
123456 01923 안녕하세요 이것은 텍스트입니다 123456 생성 (01923) 123456

괄호로 묶인 번호의 교환 세그먼트의 중요성은 영국 및 대부분의 다른 국가에서 교환 세그먼트를 생략하고 동일한 교환에있는 번호 간의 통화를 할 수 있다는 것입니다. 그러나 07, 08 및 09 시리즈 전화 번호에는 적용되지 않습니다.

더 효율적인 솔루션이 있다고 확신하지만이 솔루션은 매우 신뢰할 수있는 것으로 입증되었습니다. 끝에 teleNum 함수를 추가하여 더 많은 형식을 쉽게 조정할 수 있습니다.

프로시 저는 호출 스크립트에서 호출되므로

$telephone = New Telephone;
$formattedPhoneNumber = $telephone->toIntegerForm($num)

`

<?php
class   Telephone 
{   
    public function toIntegerForm($num) {
        /*
         * This section takes the number, whatever its format, and purifies it to just digits without any space or other characters
         * This ensures that the formatter only has one type of input to deal with
         */
        $number = str_replace('+44', '0', $num);
        $length = strlen($number);
        $digits = '';
        $i=0;
        while ($i<$length){
            $digits .= $this->first( substr($number,$i,1) , $i);
            $i++;
        }
        if (strlen($number)<10) {return '';}
        return $this->toTextForm($digits);
    }
    public function toTextForm($number) {

        /*
         * This works on the purified number to then format it according to the group code
         * Numbers starting 01 and 07 are grouped 5 3 3
         * Other numbers are grouped 3 4 4 
         * 
         */
        if (substr($number,0,1) == '+') { return $number; }
        $group = substr($number,0,2);
        switch ($group){
            case "02" :
                $formattedNumber = $this->teleNum($number, 3, 4); // If number commences '02N' then output will be (02N) NNNN NNNN
                break;
            default :
                $formattedNumber = $this->teleNum($number, 5, 3); // Otherwise the ooutput will be (0NNNN) NNN NNN
        }
        return $formattedNumber;

    }
    private function first($digit,$position){
        if ($digit == '+' && $position == 0) {return $digit;};
        if (!is_numeric($digit)){
            return '';
        }
        if ($position == 0) {
            return ($digit == '0' ) ? $digit :  '0'.$digit;
        } else {
            return $digit;
        } 
    }
    private function teleNum($number,$a,$b){
        /*
         * Formats the required output 
         */
        $c=strlen($number)-($a+$b);
        $bit1 = substr($number,0,$a);
        $bit2 = substr($number,$a,$b);
        $bit3 = substr($number,$a+$b,$c);
        return '('.$bit1.') '.$bit2." ".$bit3;
    }
}

0

국가 코드가없는 영국 유선 전화 용입니다.

function format_phone_number($number) {
    $result = preg_replace('~.*(\d{2})[^\d]{0,7}(\d{4})[^\d]{0,7}(\d{4}).*~', '$1 $2 $3', $number);
    return $result;
}

결과:

2012345678
becomes
20 1234 5678

0

형식을 변경할 수있는 substr 기반 함수를 살펴보십시오.

function phone(string $in): string
{
    $FORMAT_PHONE = [1,3,3,4];
    $result =[];
    $position = 0;
    foreach ($FORMAT_PHONE as $key => $item){
        $result[] = substr($in, $position, $item);
        $position += $item;
    }
    return '+'.implode('-',$result);
}

0

전화 번호 확인

$phone = '+385 99 1234 1234'

$str = preg_match('/^\+?\d{1,3}[\s-]?\d{1,3}[\s-]?\d{1,4}[\s-]?\d{1,4}$/', $phone);

if($str){
return true;
}else{
return false;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.