0

我是一个新的提问者,但长期阅读,我似乎无法找到我的 PHP 代码的解决方案。

在提交表单联系人后,我正在尝试发送和发送电子邮件。小菜一碟,直到我决定要将我的 html 电子邮件保存在不同的文件中,而不是将其定义为我的表单处理 php 文件中的字符串。我不得不说我发现以这种方式编辑消息的布局要容易得多。但事实证明,这并非易事。

我有“contact-form-process.php”

  • 解析通过表单提交的信息;
  • 将该信息添加到数组中,

IE

$formdata = array( 
  'first-name' => $_POST['first-name'], 
  'last-name' => $_POST['last-name'], 
  'email' => $_POST['email'], 
  'message-subject' => filter_var($_POST['message-subject'], FILTER_SANITIZE_STRING), 
  'message-body' => filter_var($_POST['message-body'], FILTER_SANITIZE_STRING), 
);

和“sender-copy.php”

  • 是我发送的实际 html 电子邮件;
  • 使用“contact-form-process.php”中定义的变量执行一些简单的操作,

IE

<p>
  Dear <?php $value = (isset($formdata['first-name']) ? $formdata['first-name'] : 'NOT-SET'), 
</p>

现在回到“contact-form-process.php”,在其中我将 html 电子邮件正文作为字符串 ( $message = file_get_contents('sender-copy.php', TRUE);) 包含在内,并将其用于评估它包含的 PHP 代码片段:

$message = preg_replace_callback    (
                            '/<\?php(.+)\?>/', 
                            function ($match) {
                                eval($match[1]); 
                                return $value; 
                            }, 
                            $message
                        );

所以现在我很难从“sender-copy.php”字符串中评估的 PHP 片段中检索 $formdata 数组值。这是我的输出的副本:

<p>
  Dear NOT-SET, 
</p>

任何人?谢谢你。

4

1 回答 1

0

与 JavaScript 不同,PHP 不从父作用域继承变量。这意味着在您的preg_replace_callback回调中,$formdata 不存在

幸运的是,有一种简单的方法可以继承它:

function($match) use ($formdata) { ... }

也就是说,我强烈建议改变你的方法。你可以这样做:

ob_start();
require("sender-copy.php");
$message = ob_get_contents();
ob_end_clean();

或者,更安全的是,您可以将“发件人副本”更改为:

<p>Dear {first-name},</p>

并使用这种替换方法:

$message = preg_replace_callback("/\{([^}]+)\}/",function($m) use ($formdata) {
    if( isset($formdata[$m[1]])) return $formdata[$m[1]];
    return "NOT-SET";
},$message);
于 2013-11-03T14:16:58.533 回答