正则表达式,以确定电话号码是“本地”,“国家”,“移动”,“溢价”等

时间:2011-04-29 11:26:51

标签: php regex bash preg-match grep

我正在敲一个简单的PHP表单来显示我们的星号系统上的电话呼叫使用情况。所有呼叫信息都记录在数据库中。

我熟悉正则表达式和PHP(在某种程度上),但之前从未试图将两者结合起来。

解析数据,我想识别拨出呼叫类型,以便我们以正确的费率向客户收费。我将拨出的电话分成多个班级,例如“本地”,“国家”,“移动”,“高级”,“国际”和“内部”,但是我尝试匹配第一类(即'本地')失败了。

本地调用将始终具有9前缀,后面可选地后跟本地区域代码(在此示例中为01234)。然后是本地编号(本例中为567890)。请注意,本地号码不能以零开头。

因此,我尝试与上述示例匹配的数字为9012345678909567890

我通常会使用^9(01234)?[1-9][0-9]+这样的正则表达式,并从bash shell中测试,我得到了预期的结果

$ echo 091234567890 | egrep -e '^9(01234)?[1-9][0-9]+'
901234567890
$ echo 9567890 | egrep -e '^9(01234)?[1-9][0-9]+'
9567890
$ echo 908001234567 | egrep -e '^9(01234)?[1-9][0-9]+'
$ echo 901987654321 | egrep -e '^9(01234)?[1-9][0-9]+'
$ echo 907890123456 | egrep -e '^9(01234)?[1-9][0-9]+'

因此尝试将其转换为在PHP中工作,我想出了以下内容:

$class='Unknown';
if (preg_match('/^9(01234)?[1-9][0-9]+/', $dest))
  $class='Local Call';
// More regex matches to follow for other classes

现在,当我在上面的

中抛出以下数字列表时
901234567890
9567890
908001234567
901987654321
907890123456

每个数字似乎与正则表达式匹配。我做错了什么?

4 个答案:

答案 0 :(得分:3)

按预期为我工作。 $dest设置正确吗?


我的测试

$nums = array(
    901234567890,
    9567890,
    908001234567,
    901987654321,
    907890123456,
);

foreach ($nums as $num) {
    if (preg_match('/^9(01234)?[1-9][0-9]+/', $num)) {
        echo "$num matches\n";
    }
}

结果

901234567890 matches
9567890 matches

答案 1 :(得分:2)

您是否将所有数字都丢弃为单个字符串?因为这与逐个发送它们完全不同。如果其中一行与正则表达式匹配,则整个测试成功。换句话说,它等同于:

echo '901234567890
9567890
908001234567
901987654321
907890123456' | egrep -e '^9(01234)?[1-9][0-9]+'

使用Wiseguy's method

答案 2 :(得分:1)

我对你的所有号码都进行了测试,但它确实有效:

$nums = array('901234567890', '9567890'
   , '908001234567', '901987654321', '907890123456');
foreach ($nums as $num) {
   if (preg_match('/^9(01234)?[1-9][0-9]+/', $num)) {
      echo "$num passes\n";
   }
   else {
      echo "$num fails\n";
   }
}

901234567890 passes
9567890 passes
908001234567 fails
901987654321 fails
907890123456 fails

在你的代码中,所有传递的东西都设置了一个变量,所以也许你需要检查它是否已被设置..

除此之外,我会说检查正则表达式的电话号码是一个注定要失败的努力。这有点远,但很难。我工作的电话号码解析课程超过1400行,但在所有情况下都无法正常工作。

答案 3 :(得分:1)

$n[] = 901234567890;
$n[] = 9567890;
$n[] = 908001234567;
$n[] = 901987654321;
$n[] = 907890123456;
$n[] = 901;

foreach( $n as $t){

if (preg_match('/^9(01234)?[1-9][0-9]+/', $t))
  echo 'Local Call' . PHP_EOL ;

}

这给了我两个本地电话?

相关问题