-1

我想验证电话是否在阵列中,但使用通配符。

在 foreach 中,我有以下代码:

$phone = '98765432'; // Data of stored phone
$match = '987*5432'; // Input with search term

echo preg_match('/^' . str_replace('*', '.*', $match) . '$/i' , $phone);

当我搜索以下内容之一时,preg_match应该可以:

9*
987*5432
987*
*876*

但是,当我搜索错误的数字时,例如,preg_match不应该工作:

8*65432
*1*
98*7777

我已经尝试过,但找不到正确的解决方案。谢谢!

编辑 1

2*2*应该传递给2020,但不传递给2002

4

2 回答 2

2

我不会尝试匹配所有内容,而是只关注数字,因为您知道您正在处理电话号码:

preg_match('/^' . str_replace('*', '\d*', $input) . '$/i' , $phone);

我写了一个简单的测试用例,似乎适用于您的输入。

$phone = '98765432'; // Data of stored phone

function test( $input, $phone) {
    return preg_match('/^' . str_replace('*', '\d*', $input) . '$/i' , $phone);
}

echo 'Should pass:' . "\n";
foreach( array( '9*', '987*5432', '987*', '*876*') as $input) {
    echo test( $input, $phone) . "\n";
}

echo 'Should fail:' . "\n";
foreach( array( '8*65432', '*1*', '98*7777') as $input) {
    echo test( $input, $phone) . "\n";
}

输出

Should pass:
1
1
1
1
Should fail:
0
0
0
于 2013-04-08T15:48:07.203 回答
2

您可以尝试使用\d,如下所示:

preg_match('/^' . str_replace('*', '(\d+)', $match) . '$/i' , $phone);
于 2013-04-08T15:48:29.623 回答