设置电话号码的格式(如果丢失,请检测并添加国家/地区代码)

时间:2018-10-15 10:59:40

标签: php regex

我有以下正则表达式查询,我建立这个主意是接受用户输入(电话号码),然后在将其存储在数据库中时确保所有号码的格式完全相同。

我遇到的问题是我的正则表达式不能满足所有情况,我将稍作解释。

这是我当前的代码:

//format phone numbers
function Number_SA($number)
{
    //strip out everything but numbers
    $number =  preg_replace("/[^0-9]/", "", $number);
    //Strip out leading zeros:
    $number = ltrim($number, '0');
    //The default country code
    $default_country_code  = '+27';
    //Check if the number doesn't already start with the correct dialling code:
    if ( !preg_match('/^[+]'.$default_country_code.'/', $number)  ) {
        $number = $default_country_code.$number;
    }
    //return the converted number:
    return $number;
}

我想要的行为如下; 如果用户输入以下任何格式,则数字应以+27

结尾
  • 797734809#缺少前导0
  • 0797734809
  • 27797734809
  • +27797734809

应该全部转换为:

  • +27797734809

PS:我首先用以下命令清除输入的数字:

function clean_input($data) 
{
    $data = trim($data);
    $data = stripslashes($data);
    $data = htmlspecialchars($data);
    return $data;
}

然后我在数字上使用Number_SA($number)函数。 换句话说:

$number = clean_input($_POST["cell_number"]);
$msisdn = Number_SA($number);

PPS:Number_SA,因为我居住在南非,所以SA代表南非,我希望它适用于我们的国家代码+27

解决方案,我最终将@KamilKiełczewski答案构建到程序中,如下所示:

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    if (empty($_POST["cell_numbers"])) {
        $err = "Please add numbers!";
    } else {
        $numbers = test_input($_POST["cell_numbers"]);
        $numbers = explode("\n", str_replace("\r", "", $numbers));
        foreach ($numbers as $number) {
            $msisdn = preg_replace('/^(?:\+27|27|0)?/','+27', $number);
            //insert into the database
        }        
    }
}

2 个答案:

答案 0 :(得分:3)

您可以使用开关来检查数字的格式,并相应地进行更改:

<?php

$x = [
    '797734809',
    '0797734809',
    '27797734809',
    '0027797734809',
    '+27797734809',
];

function formatPhoneNo($no) {
    switch (true) {
        case (preg_match('#^7\d{8}$#', $no)):
            $no = '+27' . $no;
            break;
        case (preg_match('#^07\d{8}$#', $no)):
            $no = '+27' . substr($no, 1);
            break;
        case (preg_match('#^277\d{8}$#', $no)):
            $no = '+' . $no;
            break;
        case (preg_match('#^00277\d{8}$#', $no)):
            $no = '+' . substr($no, 2);
            break;
        case (preg_match('#^\+277\d{8}$#', $no)):
            break;
        default:
            throw new InvalidArgumentException('Invalid format supplied');
            break;
    }
    return $no;
}

foreach ($x as $y) {
    echo formatPhoneNo($y) . "\n";
}

我在您的数组中添加了一种额外的格式,有些人在00之后加上国家代码,而没有+。输出:

+27797734809 
+27797734809 
+27797734809 
+27797734809 
+27797734809

您可以在这里看到https://3v4l.org/ZVrNm

答案 1 :(得分:0)

这是您的正则表达式:

^(?:\+27|27|0)?(\d*)

,如果它与某些内容匹配,请使用以下命令:+27$1

以下是有效的示例(已改进):https://regex101.com/r/VaUAKN/7

EXPLANATION:

首先,我们想用数字^(?:\+27|27|0)?分割前缀(如果存在),组内的?:使前缀组在结果中被忽略。 ^表示行的开头。最后一个?允许前缀不存在。最后(\d*)捕获前缀后面的数字

PHP working exampleWiktor Stribiżew指出,在regexp中,我们可以省略(\d*)$1并将\+27|27更改为\+?27): / p>

$numOld = "2712345678";
$num = preg_replace('/^(?:\+?27|0)?/','+27', $numOld); // > $num = "+2712345678"