Formatting Phone Numbers in PHP

前端 未结 20 2227
面向向阳花
面向向阳花 2020-11-28 19:39

I am working on an SMS app and need to be able to convert the sender\'s phone number from +11234567890 to 123-456-7890 so it can be compared to re

20条回答
  •  眼角桃花
    2020-11-28 20:09

    All,

    I think I fixed it. Working for current input files and have following 2 functions to get this done!

    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
    

    function 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](?  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
    

    Notice I have this in a class lib, so thus the "self::validate_phone_number" call from the first function/method.

    Notice line # 32 of the "validate_phone_number" function where I added the:

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

    to get me the false return needed if not valid phone number.

    Still need to test this against more data, but working on current data, with current format and I'm using style '8' for this particular data batch.

    Also I commented out the "extension" logic as I was constantly getting errors from it, seeing I do not have any of that info in my data.

提交回复
热议问题