我正在敲一个简单的PHP表单来显示我们的星号系统上的电话呼叫使用情况。所有呼叫信息都记录在数据库中。
我熟悉正则表达式和PHP(在某种程度上),但之前从未试图将两者结合起来。
解析数据,我想识别拨出呼叫类型,以便我们以正确的费率向客户收费。我将拨出的电话分成多个班级,例如“本地”,“国家”,“移动”,“高级”,“国际”和“内部”,但是我尝试匹配第一类(即'本地')失败了。
本地调用将始终具有9
前缀,后面可选地后跟本地区域代码(在此示例中为01234
)。然后是本地编号(本例中为567890
)。请注意,本地号码不能以零开头。
因此,我尝试与上述示例匹配的数字为901234567890
或9567890
。
我通常会使用^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
每个数字似乎与正则表达式匹配。我做错了什么?
答案 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]+'
答案 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 ;
}
这给了我两个本地电话?