PHP调试preg-replace回调函数

问题描述 投票:2回答:2

我正在使用Eclipse和Xdebug来调试我的php代码,这很好用。但是有一种我无法调试的代码:回调函数

我正在使用preg_replace:

$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', "\bbcode_div('\$2', '\$3')", $_POST["data"]);

它可以调用函数,但是在调试时,即使有一个断点,eclipse也不会进入函数内部。

如何让调试器进入该函数?

编辑:我需要使用preg_replace。

php eclipse callback preg-replace xdebug
2个回答
4
投票

确保你使用的是preg_replace_callback()

preg_replace_callback('/ /', 'replace', 'this is not a complicated matter');

function replace($t)
{
   var_dump($t);    // <-- set breakpoint here
}

在调用var_dump()之前,这次制动五次。


编辑:当preg_replace()e修饰符一起使用时,需要一些hackery。在这种情况下,设置断点是不够的。你必须明确告诉XDebug打破:

function replace($t)
{
   // Production systems might (should) not have this function
   if (function_exists('xdebug_break'))
   {
      xdebug_break();
   }

   // Rest of the code...
}

2
投票

首先,我想提一下使用preg_replace_callback。我知道你提到你必须使用preg_replace(没有给出任何理由),但我先告诉你,你应该做什么并解释为什么preg_replace是不好的选择。

您的代码如下所示:

$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', "\bbcode_div('\$2', '\$3')", $_POST["data"]);

它可以改写成以下内容:

<?php
$regex = '{\[div(?:=(.*?))?\](.*??)\[/div\]}iu';
$pc = preg_replace_callback($regex, function ($matches) {
    return bbcode_div($matches[1], $matches[2]);
});

或者如果您仍然使用PHP 5.2或更早版本(严重更新)。

<?php
$regex = '{\[div(?:=(.*?))?\](.*??)\[/div\]}iu';
$pc = preg_replace_callback($regex, create_function('$matches', '
    return bbcode_div($matches[1], $matches[2]);
'));

现在,我将解释为什么/e是不好的选择。它给人一种虚假的安全感。当使用双引号代替时,您的安全性几乎被打破。

<?php
$_POST['code'] = 'echo "broken";';
$_POST['data'] = '[div]{${eval($_POST[code])}}[/div]';
$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', 'bbcode_div("$2", "$3")', $_POST["data"]);

当使用'字符时,addslashes()在它不应该逃脱时(/e在内部使用addslashes!)。因此,如果用户输入"字符,那么在进行调用时它将被更改为\"(在单引号中,\只能转义\',否则它将按字面插入)。这可能不是你想要的东西。 /e修饰符被打破。好吧,至少在PHP中。 Perl一个很好......

某些项目受其影响,例如使用/e修饰符的圆形立方体。它引起了changes in codebase。如果你可以通过不使用/e修饰符来保护它们,为什么还要为黑客攻击而烦恼呢。

另外,阅读https://wiki.php.net/rfc/remove_preg_replace_eval_modifier(它已被接受,下一个PHP主要版本(PHP 5.5或PHP 6.0)将弃用此修饰符)。

© www.soinside.com 2019 - 2024. All rights reserved.