17

我有以下工作代码:

$test = '123456';

$int = preg_match('/^\d+$/', $test, $matches);

print_r(array($int, $matches));

但是,当我在键盘上执行它时,我得到了错误:

警告:preg_match():第 5 行的内部 pcre_fullinfo() 错误 -3

但是代码在我自己的机器上运行(代码应该很好恕我直言)。

我需要在将来分发我的代码,所以如果它会根据某些配置而中断,那就太糟糕了。那么键盘在它上面中断的原因是什么?

4

1 回答 1

30

通过键盘执行的代码在非常受限的环境中运行:

代码执行由基于 geordi 的主管处理。策略是在 ptrace 下运行所有​​内容,其中包含许多系统调用 disallowed 或 ignored。编译器和最终可执行文件都在 chroot 监狱中执行,具有严格的资源限制。主管是用 Haskell 编写的。

虽然您不希望破坏正则表达式引擎,但 pcre 库很可能在内部使用了被键盘环境阻止的东西。没有生产系统使用如此严格的限制,因此您应该可以安全地在应用程序中使用该代码。

错误代码代表“PCRE_ERROR_BADOPTION - 无效值。但是,发生错误的 PHP 源代码中的代码rc = pcre_fullinfo(pce->re, extra, PCRE_INFO_CAPTURECOUNT, &num_subpats);使用了一个常量来表示什么。所以这显然意味着pcre库在键盘上被破坏了。

如果您想完全安全,您可以使用 libpcre 编写一个小型 C 程序,在同一个正则表达式上调用该函数。

于 2012-01-14T01:24:16.153 回答