我正在使用Eclipse和Xdebug来调试我的php代码,这很好用。但是有一种我无法调试的代码:回调函数
我正在使用preg_replace:
$pc = preg_replace('#\[div(=(.*))?\](.*?)\[/div\]#iuUe', "\bbcode_div('\$2', '\$3')", $_POST["data"]);
它可以调用函数,但是在调试时,即使有一个断点,eclipse也不会进入函数内部。
如何让调试器进入该函数?
编辑:我需要使用preg_replace。
确保你使用的是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...
}
首先,我想提一下使用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)将弃用此修饰符)。