我有以下正则表达式查询,我建立这个主意是接受用户输入(电话号码),然后在将其存储在数据库中时确保所有号码的格式完全相同。
我遇到的问题是我的正则表达式不能满足所有情况,我将稍作解释。
这是我当前的代码:
//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
结尾应该全部转换为:
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
}
}
}
答案 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 example(Wiktor Stribiżew指出,在regexp中,我们可以省略(\d*)
和$1
并将\+27|27
更改为\+?27
): / p>
$numOld = "2712345678";
$num = preg_replace('/^(?:\+?27|0)?/','+27', $numOld); // > $num = "+2712345678"