Search code examples
phpregexpreg-match

Not understanding why my PHP program failed to check the phone number?


I do not understand why the code I have written is failing to identify the phone number. Here is the code:

 <?php
        $sPattern = "/^
            (?:                                 # Area Code
                (?:                            
                    \(                          # Open Parentheses
                    (?=\d{3}\))                 # Lookahead.  Only if we have 3 digits and a closing parentheses
                )?
                (\d{3})                         # 3 Digit area code
                (?:
                    (?<=\(\d{3})                # Closing Parentheses.  Lookbehind.
                    \)                          # Only if we have an open parentheses and 3 digits
                )?
                [\s.\/-]?                       # Optional Space Delimeter
            )?
            (\d{3})                             # 3 Digits
            [\s\.\/-]?                          # Optional Space Delimeter
            (\d{4})\s?                          # 4 Digits and an Optional following Space
            (?:                                 # Extension
                (?:                             # Lets look for some variation of 'extension'
                    (?:
                        (?:e|x|ex|ext)\.?       # First, abbreviations, with an optional following period
                    |
                        extension               # Now just the whole word
                    )
                    \s?                         # Optionsal Following Space
                )
                (?=\d+)                         # This is the Lookahead.  Only accept that previous section IF it's followed by some digits.
                (\d+)                           # Now grab the actual digits (the lookahead doesn't grab them)
            )?                                  # The Extension is Optional
            $/x";                               // /x modifier allows the expanded and commented regex

        $aNumbers = array(
            'here is your website: 123-456-7890x123',
            '123.456.7890x123',
            '123 456 7890 x123',
            '(123) 456-7890 x123',
            '123.456.7890x.123',
            '123.456.7890 ext. 123',
            '123.456.7890 extension 123456',
            '123 456 7890', 
            '123-456-7890ex123',
            '123.456.7890 ex123',
            '123 456 7890 ext123',
            '456-7890',
            '456 7890',
            '+1 456 7890 x123',
            '1234567890',
            '() 456 7890'
        );

        foreach($aNumbers as $sNumber) {
            if (preg_match($sPattern, $sNumber, $aMatches)) {
                echo 'Matched ' . $sNumber . "\n";
                print_r($aMatches);
            } else {
                echo 'Failed ' . $sNumber . "\n";
            }
        }
    ?>

Here is the output:

Failed here is your website: 123-456-7890x123 
Matched 123.456.7890x123 Array ( [0] => 123.456.7890x123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123 456 7890 x123 Array ( [0] => 123 456 7890 x123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched (123) 456-7890 x123 Array ( [0] => (123) 456-7890 x123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123.456.7890x.123 Array ( [0] => 123.456.7890x.123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123.456.7890 ext. 123 Array ( [0] => 123.456.7890 ext. 123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123.456.7890 extension 123456 Array ( [0] => 123.456.7890 extension 123456 [1] => 123 [2] => 456 [3] => 7890 [4] => 123456 ) 
Matched 123 456 7890 Array ( [0] => 123 456 7890 [1] => 123 [2] => 456 [3] => 7890 ) 
Matched 123-456-7890ex123 Array ( [0] => 123-456-7890ex123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123.456.7890 ex123 Array ( [0] => 123.456.7890 ex123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 123 456 7890 ext123 Array ( [0] => 123 456 7890 ext123 [1] => 123 [2] => 456 [3] => 7890 [4] => 123 ) 
Matched 456-7890 Array ( [0] => 456-7890 [1] => [2] => 456 [3] => 7890 ) 
Matched 456 7890 Array ( [0] => 456 7890 [1] => [2] => 456 [3] => 7890 ) 
Failed +1 456 7890 x123 
Matched 1234567890 Array ( [0] => 1234567890 [1] => 123 [2] => 456 [3] => 7890 ) 
Failed () 456 7890 

My focus is on the line:

'here is your website: 123-456-7890x123',
'+1 456 7890 x123',

There are number but it is not extracting it and checking it. How I can I do that?


Solution

  • Your regex pattern starts with "^" so the number has to start from the beginning of the string. Remove this and it will match i.e. change:

        $sPattern = "/^
    

    to

        $sPattern = "/
    

    Also I recommend using regex101.com for checking your regular expressions. I find it extremely helpful.