我的用户希望能够在他们的网站上找到联系表格。可以理解的。但它并没有真正发挥作用。
<?php
function ubbreplace($text){
$text = str_replace("[contact-form]",'<?php include("contactform.php"); ?>',$text);
return $text;
}
?>
包含不包括联系表格。那是为什么?
答案 0 :(得分: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 :(得分: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;
}
答案 2 :(得分:1)
你正在完全从错误的一端接近这个概念,你正在做的是使用字符串,这些字符串不会被PHP作为函数处理,或包含或其他核心标记。
您可以将变量插入到字符串中,但这会在执行时发生,然后不会重新执行该字符串(并且还忽略了包含根本不是变量而是语言构造<< / em>的)。
那么,你能做些什么呢?好吧 - 使用以下逻辑重新排列代码:
所以,要做到这一点尝试这个代码逻辑(显然是自定义)。您想要找到已设置的“标志”,然后用正确的标记替换它
<?php
if( stripos($text,"[contact-form]") !== false){
include("contactform.php");
}
?>
上面的内容可能并不完全符合您的意图,因为它的行为在很大程度上取决于所包含的PHP文件中的内容。
您可能需要重新排列包含内容(如果您确实需要,可以从包含return
数据中获取,但我不建议这样做)。
作为一项小改进,我还建议使用mb_stripos()
函数而不是标准stripos();
。
为了获得更清晰的更有用的结果,将include的内容设置为$contactForm = "HTML contact form data";
之类的变量,然后始终运行include,但只有在找到标志时才输出内容:
包含:
$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;
}
?>
Include in the PHP manual,请注意对返回值的引用
使用输出缓冲的Splash58's Answer(和Brogans Answer)也是完美的 良好的解决方案,并节省了大量量化包含输出的工作量 我的答案中的变量,虽然我的答案主要是解释 目的和原始问题的失败。
给定一个完全打开的选项,我会选择使用输出缓冲 解决这个问题,但你需要知道发生了什么,所以如果 输出缓冲对你来说是新的definitely read up on it。