我的用户希望能够在他们的网站上有联系表格。可以理解。但这并没有真正发挥作用。
<?php
function ubbreplace($text){
$text = str_replace("[contact-form]",'<?php include("contactform.php"); ?>',$text);
return $text;
}
?>
包含内容不包括联系表格。这是为什么?
您正在使用的 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;
?>
您完全从错误的一端接近这个概念,您正在做的是使用字符串,并且这些字符串不会被 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)也是一个完美的解决方案 很好的解决方案,并且节省了大量将包含的输出量化到的工作 我的答案中存在变量,尽管我的答案主要是为了解释 目的和你原来问题的失败。
如果有一个完全开放的选项,我会选择使用输出缓冲 要解决这个问题,但您确实需要知道发生了什么,所以如果 输出缓冲对您来说是新的一定要先阅读它。
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;
}