使用preg_match()在正则表达式字符串中连接变量

时间:2014-01-17 09:04:18

标签: php regex

我正在使用preg_match()函数来确定函数是否已执行。

if( preg_match( '/^([0-9]+,){0,3}[0-9]+$/', $string ) ) { ... }

但是我必须使用整数变量并将其集成到正则表达式中:

$integer = 4;
if( preg_match( '/^([0-9]+,){0,' . $integer . '}[0-9]+$/', $string ) ) { ... }

但它应该什么时候不匹配。我怎么不能连接正则表达式字符串中的变量?

修改

strval($integer)解决了我的问题。我必须在连接它之前将整数值转换为字符串(虽然我不明白为什么):

$integer = 4;
if( preg_match( '/^([0-9]+,){0,' . strval($integer) . '}[0-9]+$/', $string ) ) { ... }

1 个答案:

答案 0 :(得分:1)

每当将变量连接到正则表达式模式时,您应该通过将变量传递给the preg_quote function来实现。

但是,如果变量var与示例4中的变量一样,则不会有任何区别。您正在使用的模式是:

/^([0-9]+,){0,4}[0-9]+$/

在这种情况下,如果它不起作用:检查$string值,并使确定模式匹配。顺便说一下,/^(\d+,){,4}\d+$/更短,做同样的事情。

调用strval无法解决任何问题,AFAIK ...我使用以下代码段测试了代码而不是strval

$string = '1234,32';
if (preg_match( '/^([0-9]+,){0,4}[0-9]+$/', $string) )
{
    echo 'matches',PHP_EOL;
    $count = 4;
    if (preg_match( '/^([0-9]+,){0,'.$count.'}[0-9]+$/', $string ) )
        echo 'matches, too',PHP_EOL;
}

正如我预期的那样输出:

matches
matches, too

在你的情况下,我只想写:

$count = 4;
preg_match('/^(\d+,){,'.preg_quote($count, '/').'}\d+$/', $string);

这是无可否认比仅仅调用strval更安全,因为您没有考虑可能的特殊正则表达式字符(+[]{}/\$^?!:<=*.等)