【问题标题】:How to replace a function in php?如何替换php中的函数?
【发布时间】:2011-12-30 14:07:21
【问题描述】:

我有一个包含以下内容的 PHP 文件: abc.php

echo 'echo echo echo';
echo $x.'echo echo echo'.str_replace($x, 'abc', $y);
echo number_format(1234567); echo "echo echo echo";

我想将 abc.php 中的 "echo" 函数替换为 "$b .=" ,替换后的结果是:

$b .= 'echo echo echo';
$b .= $x.'echo echo echo'.str_replace($x, 'abc', $y);
$b .= number_format(1234567); echo "echo echo echo";

我该怎么做?请帮帮我,非常感谢!

注意:我通过 file_get_contents 读取 abc.php(结果是一个字符串)。之后,我将“echo”替换为“b .=”,然后使用“eval”执行。

【问题讨论】:

  • 您是否有意排除了最后一个echo,第二个语句,最后一行?如果你这样做了(我强烈建议不要这样做)你可以在源上使用#^(echo)#$b .= preg_replace() - 根据你想要输出缓冲的可能性,我会赞成任何在这里回答。
  • 我会手动操作以确保不会出错。但根据你在做什么,你可以考虑输出缓冲。
  • 为什么不直接编辑 PHP 文件?
  • 您是要override echo,还是要在文件中用$b .= 查找并替换echo
  • 真的是你想要做的,还是X-Y Problem

标签: php function replace


【解决方案1】:

如果无法修改代码,可以启动输出缓冲并将输出保存在变量中:

ob_start();
include('abc.php');
$b = ob_get_clean();

【讨论】:

    【解决方案2】:

    如果 abc.php 作为 PHP 执行

    如果通过includerequire 访问此文件(abc.php),您可以为此使用输出缓冲。请参阅manual page for ob_start()

    $file_path = '/my/file/path/abc.php';
    ob_start();
    require $file_path;
    $b .= ob_get_clean();
    

    有关ob_get_clean() 的更多信息,请参阅the man page

    如果将 abc.php 作为纯文本拉入进行预处理

    或者,如果您使用file_get_contents() 而不是requireinclude 来访问abc.php,则可以使用简单的字符串替换:

    $file_path = '/my/file/path/abc.php';
    $file_contents_string = file_get_contents($file_path);
    $replaced_string = str_replace('echo ', '$b .= ', $file_contents_string);
    file_put_contents($file_path);
    

    此替换将替换 echo 的所有实例,因此它非常贪婪,最终替换的可能比您最初预期的要多。这可以通过使用preg_replace()substr()strpos() 的组合来缓解。

    【讨论】:

    • 这种替换很危险,好像文本中包含'echo'(如示例中一样,它也会被替换); echo 还支持许多操作数:echo 'a'、'b'、'c';如果您只是用赋值替换它,这将是无效的语法。
    • 是的,echo 可以处理多个参数,但是很少这样做,并且在问题示例代码中根本没有提到。事实上,我为我的团队编写的编码风格指南禁止使用echo,而是使用字符串连接来解决echo 在重构期间很容易成为分配给变量的字符串的问题。
    【解决方案3】:

    注意 echo() is not actually a function - http://php.net/manual/en/function.echo.php ;至于用另一个函数动态替换一个函数,这在 PHP 中通常是不可能的(你会得到一个Cannot redeclare function 错误)。

    至于您没有问的 可能 问题 - “我如何将它放入变量中,所以它不会直接回显”(不,思考不算数):

    请参阅输出缓冲功能 - 例如ob_get_clean() - http://php.net/manual/en/function.ob-get-clean.php

    【讨论】:

    • 好吧,你不应该,但是php.net/manual/en/function.runkit-function-redefine.php - 无论如何都不能与echo 一起工作。
    • @Bracketworks:PECL 包runkit:0.9 版,状态测试版,最后发布 2006-06-06 ?我会......犹豫......使用它。
    • 哦,我同意,但它确实存在。在这一点上它已经被某些东西取代了,不是吗?
    • @Bracketworks:它应该被下一个版本的classkit取代(就像PHP6应该......没关系,我们不要去那里),但是 更早被放弃了。见php.net/manual/en/intro.classkit.phppecl.php.net/package/classkit
    • 我以为是classkit。另外——PHP 6 会很棒!你觉得它什么时候会出来?下个月?是阿尔法吗?有可用的二进制文件吗?我买了所有的书!疱疹!卧槽!太棒了! -- 嗯,5.4 就可以了……现在
    【解决方案4】:

    为什么这种情况不断发生?人们有一个问题 A,然后提出一个解决方案 B,该解决方案非常困难、奇怪或不遵循任何标准做法,这引发了问题 C。然后他们只要求问题 C 的解决方案。

    使用output buffering解决问题A。

    【讨论】:

      猜你喜欢
      • 2011-11-05
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 2014-08-13
      • 2013-03-12
      • 2017-07-31
      相关资源
      最近更新 更多