如何使用include()作为str_replace()的替换参数?

问题描述 投票:0回答:3

我的用户希望能够在他们的网站上有联系表格。可以理解。但这并没有真正发挥作用。

<?php
function ubbreplace($text){
    $text = str_replace("[contact-form]",'<?php include("contactform.php"); ?>',$text);
    return $text;
}
?>

包含内容不包括联系表格。这是为什么?

php replace
3个回答
2
投票

您正在使用的 str_replace 函数正在按预期工作。如果您在浏览器中没有看到任何内容,请查看源代码,您将在 HTML 代码中看到一个

<?php
标记。

输出是通常进入浏览器的内容。缓冲区是数据的缓存。输出缓冲区是数据的缓存,这些数据通常会发送到您的浏览器,但由于您对其进行了缓冲而没有发送。

为了获得您想要的结果,我们需要获取 contactform.php 文件的内容并将 [contact-form] 替换为这些内容。我们可以通过将 contactform.php 的输出捕获到变量中并使用该变量作为替换来实现此目的。

<?php

function ubbreplace($text){
    if(strpos($text, '[contact-form]') !== false) {
        ob_start();
        require 'contactform.php';
        $replace = ob_get_contents();
        ob_end_clean();

        $text = str_replace('[contact-form]', $replace, $text);
    }
    return $text;
}

$content = ubbreplace('Hello world! [contact-form]');
echo $content;

?>

1
投票

您完全从错误的一端接近这个概念,您正在做的是使用字符串,并且这些字符串不会被 PHP 作为函数处理,或者包含或其他核心标记。

您可以将变量插入到字符串中,但这发生在执行时,并且该字符串将不会被重新执行(并且还忽略了包含根本不是变量而是一个语言构造的事实)。

那么,对此你能做什么呢?好吧 - 用以下逻辑重新排列您的代码:

  • 您有一个想要查找的字符串,找到后即可采取行动。

因此,要执行此操作,请尝试此代码逻辑(显然是自定义的)。你想找到你设置的“标志”,然后用正确的标记替换它,

<?php
if( stripos($text,"[contact-form]") !== false){
    include("contactform.php");
} 
?>

上面的内容可能不会完全按照您的预期进行,因为它的行为在很大程度上取决于所包含的 PHP 文件内的内容。

您可能需要重新排列包含的内容(如果确实需要,您可以

return
包含中的数据,但我真的不建议这样做)。

作为一个小改进,我还建议使用

mb_stripos()
函数而不是标准
stripos();

因此,为了获得更清晰、更可用的结果,请将包含的内容设置为变量,例如

$contactForm = "HTML contact form data";
,然后始终运行包含,但仅在找到标志时输出内容:

包括包含:

$contactForm = "Some HTML contact data";

父文件包含:

<?php
include("contactform.php");
if( stripos($text,"[contact-form]") !== false){
     print $contactForm;     
} 
?>

或者您可能更容易实现的是:

<?php
include("contactform.php");
function ubbreplace($text){
    $text = str_replace("[contact-form]",$contactForm,$text);
    return $text;
}
?>

包含在 PHP 手册中,请注意对返回值的引用


使用输出缓冲的

Splash58's Answer(和Brogans Answer)也是一个完美的解决方案 很好的解决方案,并且节省了大量将包含的输出量化到的工作 我的答案中存在变量,尽管我的答案主要是为了解释 目的和你原来问题的失败。

如果有一个完全开放的选项,我会选择使用输出缓冲 要解决这个问题,但您确实需要知道发生了什么,所以如果 输出缓冲对您来说是新的一定要先阅读它


1
投票
function ubbreplace($text){
    if (strpos($text, "[contact-form]") !== false) {
       ob_start();
       include("contactform.php");
       $replace = ob_get_contents();
       ob_end_clean();
       $text = str_replace("[contact-form]", $replace, $text);
    }
    return $text;
}
© www.soinside.com 2019 - 2024. All rights reserved.