1

I purchased a contact form. Great little thing but I need to convert the validation for the phone number to allow for UK number formats - in other words, to allow for spaces.

Right now it validates without spaces and has a minimum length of 8 characters:

if(is_numeric($phone))
{
    if(!$phone || strlen($phone) < 8)
    {
        $error .= "Please enter your phone number without spaces.<br />";
    }
}
else
{
    $error .= "Please enter numeric characters in the phone number field.<br />";
}
ObscureRobot
  • 7,306
  • 2
  • 27
  • 36
Richard Bland
  • 73
  • 1
  • 3
  • 12
  • it would be helpful if you could enter 'template' for UK phone :) – hummingBird Nov 11 '11 at 19:56
  • ok question how strong of validation do you want? also what is the length of a uk phonenum – Laurence Burke Nov 11 '11 at 19:56
  • 1
    This depends on the formats you wish to accept, as many people type their phone numbers differently i.e. +44(0)1234567890, 01234567890, 01234 567890, 0208 1234 567, 020 1234 5678 etc. Can you can let us know which you'd like to accept, or if you'd like to accept all 'regular' formats? – BenTheDesigner Nov 11 '11 at 19:58
  • Hello! Sorry been up all night working on the site. I am not too bothered about the different ways, all ways would be good. I am no good with PHP so any help would be greatly appreciated. – Richard Bland Nov 12 '11 at 09:23
  • See also http://stackoverflow.com/questions/32401/validate-a-uk-phone-number – SDC Mar 05 '13 at 15:11

6 Answers6

12

Phone numbers are typically horrible for regex patterns, which is what you will need.

This pattern for example:

$pattern = "/^(\+44\s?7\d{3}|\(?07\d{3}\)?)\s?\d{3}\s?\d{3}$/";

$match = preg_match($pattern,$input);

if ($match != false) {
    // We have a valid phone number
} else {
    // We have an invalid phone number
}

That pattern will match with +44 included or not e.g.

all these will match:

07222 555555

(07222) 555555

+44 7222 555 555

These won't

7222 555555

+44 07222 555555

(+447222) 555555

There are a load of sites that offer tutorials / cheat sheets etc. for regular expressions try some of these:

http://regexlib.com/Default.aspx

as well as a very good stack overflow post:

A comprehensive regex for phone number validation

Community
  • 1
  • 1
David Barker
  • 14,484
  • 3
  • 48
  • 77
2

So you just want to allow spaces?

Then you could use str_replace() to ignore spaces, right at the beginning:

$phone = str_replace(' ', '', $phone);
  • This doesnt seem to work, but I except I know nothing about PHP - perhaps you could replace the code I have above with something that will validate all ways of entering a phone number? – Richard Bland Nov 12 '11 at 09:24
1

This matches all UK formats with a wide variety of punctuation:

  ^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)44\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)(?:\d{5}\)?[\s-]?\d{4,5}|\d{4}\)?[\s-]?(?:\d{5}|\d{3}[\s-]?\d{3})|\d{3}\)?[\s-]?\d{3}[\s-]?\d{3,4}|\d{2}\)?[\s-]?\d{4}[\s-]?\d{4}|8(?:00[\s-]?11[\s-]?11|45[\s-]?46[\s-]?4\d))(?:(?:[\s-]?(?:x|ext\.?\s?|\#)\d+)?)$

Extract the various parts using this pattern

  ^\(?(?:(?:0(?:0|11)\)?[\s-]?\(?|\+)(44)\)?[\s-]?\(?(?:0\)?[\s-]?\(?)?|0)([1-9]\d{1,4}\)?[\s\d-]+)(?:((?:x|ext\.?\s?|\#)\d+)?)$

The country code is in $1 (and is null for national format). The NSN is in $2. The optional extension is in $3.

Remove all non-digits from $2 for further processing. The next step is to make sure the NSN is in a valid range and is a valid length (either 9 or 10 digits, depending on the range).

The list of patterns is too long to reproduce here but is available at:

http://aa-asterisk.org.uk/index.php/Regular_Expressions_for_Validating_and_Formatting_GB_Telephone_Numbers

g1smd
  • 51
  • 3
1

You could parse the input to an integer, then validate for the correct number of digits;

$mobileNumber = intval($mobileNumber);

if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) {
//number has the right number of digits for a UK mobile number
} else {
//number does not have the right number of digits
}

Explained;

$mobileNumber = intval($mobileNumber);

This removes all non numerical characters from the string, and leading zero (eg spaces, brackets, plus signs, decimals etc);

*if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) {*

This regular expression then checks that the string contains either 12 or 10 digits which would cover 447712345678 (12 digits) or 7791234567 (10 digits). It is matched in two sub clauses (^\d{12}$) or (^\d{10}$) the carat (^) and dollar ($) represent to match everything from the very beginning (^) and to the very end ($) of the string. the \d represents any digit, and the following {12} means match the previous statement that number of times.

This does not mean that the number is valid, you could use an API like twillio to do additional validation of the numebr https://www.twilio.com/help/faq/sms/does-twilio-check-to-see-if-phone-numbers-can-receive-sms

For example;

$mobileNumber = '+447791234567';

$mobileNumber = intval($mobileNumber); //$mobileNumber is now 447791234567

    if (preg_match('/(^\d{12}$)|(^\d{10}$)/',$mobileNumber)==TRUE) {
//$mobileNumber matches (^\d{12}$) and is valid
        }

You could also add a check to ensure that number starts with either '07' or '447', required for UK mobiles, like this;

function isValidMobile($aNumber){
    $aNumber = intval($aNumber);
    return preg_match('/(^\d{12}$)|(^\d{10}$)/', $aNumber) && preg_match('/(^7)|(^447)/', $aNumber);
}

the intval removes leading zero,so the regular expression checks for a leadin 7 or 447.

Matt
  • 106
  • 5
1

The is_numeric function that you're using isn't really even a suitable choice for American phone numbers. For example it accepts hexadecimal numbers like 0xABCDEF, which it should reject.

For simple text matching like this, regular expressions are often the easiest solution. A regular expression specifies a pattern of text. PHP has functions to let you search for or replace regular expression matches in text.

If you define a phone number as a string of at least 7 characters containing only digits and spaces, the corresponding regular expression would be /^[0-9 ]{7,}$/. The text inside the brackets represents a set of characters, the {7,} indicates that we're looking for at least 7 of these characters in a row, and the ^ and $ indicate that our match should start at the beginning of the string and end at the end of the string. The PHP documentation has a section explaining regular expressions in greater detail.

You would use the preg_match function to ensure the phone number matched:

if (preg_match('/^[0-9 ]{7,}$/', $phone)) {
Jeremy
  • 1
  • 85
  • 340
  • 366
  • Jeremy, why not `preg_match('/^[0-9 ]+$/', $phone)`? Just wondering, since I'm not very much experienced with regular expressions. – hummingBird Nov 11 '11 at 20:00
  • How would this be written in a full statement? Am I changing the is_numeric function of the bits in the if(!$phone || strlen($phone) < 8)? - I apologise for being so dumb with PHP... ;-p – Richard Bland Nov 12 '11 at 09:26
  • @BlandyDoes: This expression would perform both steps of validation, checking the length and checking the contents. The simplest way to use it would just be to replace the `if(!$phone || strlen($phone) < 8) {` line, though I see you've already got a working solution. :-) – Jeremy Nov 12 '11 at 18:36
0

I have found a solution with javascript according to the standards mentioned [here][1].**its not regex.**if you are using this solution there are three things to take care

  • validation can be used inside the UK
  • space cant be added. you need to type in your number without spaces
  • number has to begin with zero

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<script >
var name=window.prompt("Enter cell number");
var sixformat=["013397","013398","013873","015242","015394","015395","015396","016973","016974","017683","017684","017687","019467","019755","019756"];
var twoformat=["01","02","03","05","07","08","09"];
sixdi=name.substring(0,6);
twodi=name.substring(0,2);
document.write("phone number:",name,"<br>");
document.write("phone-number length:",name.length);
if(sixformat.includes(sixdi)&&name.length==11)
{
    document.write("<br><h1>valid</h1>");
}
else if(sixdi=="016977"&&name.length==10)
{
    document.write("<br><h1>valid<h1>");
}
else if(twoformat.includes(twodi)&&(name.length==11))//011########
{
    document.write("<br><h1>valid</h1>");
}
else if(twodi=="01"&&(name.length==10))
{
    document.write("<br><h1>valid</h1>");
}
else if(name.substring(0,4)=="0800"&&(name.length==10))
{
    document.write("<br><h1>Valid</h1></br>");
}
else
{
    document.write("<h1>invalid</h1>");
}
</script>
</body>
</html>