【问题标题】:preg_match() expects parameter to be long string givenpreg_match() 期望参数是给定的长字符串
【发布时间】:2013-08-04 05:37:43
【问题描述】:

我正在检查信用卡字段以确保它们每个都包含四位数字。

function creditcard ($creditCard1,$creditCard2,$creditCard3,$creditCard4)
{
    $regexp="/^[0-9]{4}$/";

    if (preg_match($regexp,$creditCard1,$creditCard2,$creditCard3,$creditCard4))//line 18
    {
        return TRUE;
    }
    else
    {
        echo'<script type="text/javascript">alert("Enter a valid credit card number.")</script>';
        return FALSE;
    }
}

    $creditCard1=$_POST['creditCard1'];
    $creditCard2=$_POST['creditCard2'];
    $creditCard3=$_POST['creditCard3'];
    $creditCard4=$_POST['creditCard4'];
    $creditcard=creditcard($creditCard1,$creditCard2,$creditCard3,$creditCard4);

我收到此错误。

Warning: preg_match() expects parameter 4 to be long, string given in C:\xampp\htdocs\SFASC2\aa.php on line 18

我无法弄清楚我做错了什么,谢谢。有很多这样的问题,但没有一个能给我解决方案..而且我一直在用头撞墙,无疑忽略了显而易见的事情。

【问题讨论】:

  • 看看reference page of preg_match,尤其是函数的参数。
  • 您正在处理实际的信用卡?这很可怕。您是否了解与信用卡相关的所有安全要求?
  • 哦,冷静点。如果你说这是一个任务,那就没有问题了。有很多人实际上尝试处理具有如此丰富经验的真实敏感数据,这就是我问的原因。

标签: php regex preg-match


【解决方案1】:

preg_match 一次只检查一个主题。

试试下面的代码:

function creditcard($nums)
{
    $regexp="/^[0-9]{4}$/";

    for ($i = 0; $i < 4; $i++)
        if (! preg_match($regexp, $nums[$i]))
            return FALSE;
    return TRUE;
}

$creditCard1 = $_POST['creditCard1'];
$creditCard2 = $_POST['creditCard2'];
$creditCard3 = $_POST['creditCard3'];
$creditCard4 = $_POST['creditCard4'];

$ok = creditcard([$creditCard1, $creditCard2, $creditCard3, $creditCard4]);
if (! $ok)
    echo '<script type="text/javascript">alert("Enter a valid credit card number.")</script>';

【讨论】:

  • @Skippy,查看 preg_match 的签名:int preg_match ( string $pattern , string $subject [, array &amp;$matches [, int $flags = 0 [, int $offset = 0 ]]] )。它只需要一个主题。
【解决方案2】:

对于这个用例,最好使用preg_grep 而不是preg_match,因为您正在对输入数组应用单个正则表达式。使用preg_grep 的主要好处是可以避免循环输入。考虑下面的代码:

function creditcard($arr) {
    static $re="/^\d{4}$/";
    return (preg_grep($re, $arr) === $nums);
}

$result = creditcard(['5423', '1234', '1234', '1234']);
// returns true
$result = creditcard(['5423', 'A234', '1234', '1234']);
// returns false

PS:我将 $re 声明为 static,因为该变量应该只声明和初始化一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-15
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    相关资源
    最近更新 更多