使用file_get_contents()在html文件中设置php变量

时间:2016-04-29 17:59:59

标签: php html phpmailer

我设置了一个自动电子邮件系统,可以将html文件作为电子邮件发送。我使用

将该文件带入PHPMailer的电子邮件中
$mail->msgHTML(file_get_contents('mailContent.html'), dirname(__FILE__));

在PHP源代码中,在添加mailContent.html之前,我有一个变量$name='John Appleseed'(它是动态的,这只是一个例子)

在HTML文件中,我想知道是否有办法在$name标记中使用此<p>变量。

5 个答案:

答案 0 :(得分:6)

您可以在mailContent.html文件中添加mailContent.html之类的特殊字符串,然后将此字符串替换为您想要的值:

Hello %name%, …

$name='John Appleseed';

$content = str_replace('%name%', $name, file_get_contents('mailContent.html'));

在您的PHP代码中:

$content

Hello %name%, …的值为$mail->msgHTML($content, dirname(__FILE__)); ,您可以发送:

$content = str_replace(
    array('%name%', '%foo%'),
    array($name,    $foo),
    file_get_contents('mailContent.html')
);

您还可以使用两个数组在str_replace()的一次调用中替换多个字符串:

#python 3.5

from tkinter import *

#function to raise the frame on button click
def raiseFrame(frame):
    frame.tkraise()


m = PanedWindow(height=500, width=1000, orient=VERTICAL)
m.pack(fill=BOTH, expand=1)

#to expand the column and row to fill the extra space
m.grid_columnconfigure(index=0, weight=1) #this code is not working as it should
m.grid_rowconfigure(index=0, weight=1)    #this code is not working as it should

#top frame has two buttons which switches the bottom frames
topFrame = Frame(m, bg="blue")
m.add(topFrame)

button1 = Button(topFrame, text="Raise Frame 2", command=lambda: raiseFrame(frame2)) #raises frame 2 on clicking it
button1.pack(side=LEFT)
button2 = Button(topFrame, text="Raise Frame 1", command=lambda: raiseFrame(frame1)) #raises frame 1 on clicking it
button2.pack(side=LEFT)

#bottomframe acts as container for two other frames which i need to switch
bottomframe = Frame(m, bg="orange")
m.add(bottomframe)

frame1 = Frame(bottomframe, bg="yellow")
frame1.grid(row=0, column=0, sticky="news")                ##   sticky is not working   ##
frame2 = Frame(bottomframe, bg="green")
frame2.grid(row=0, column=0, sticky="news")                ##   sticky is not working   ##

label1 = Label(frame1, text="i should change")
label1.pack(padx=10, pady=10)
label2 = Label(frame2, text="i am changed !!")
label2.pack(padx=10, pady=10)

mainloop()

答案 1 :(得分:1)

以下是使用extractob_*

执行此操作的功能

extract会将键转换为数组中键值的变量。希望有道理。它会将数组键转换为变量。

function getHTMLWithDynamicVars(array $arr, $file)
{
    ob_start();

    extract($arr);

    include($file);

    $realData = ob_get_contents();

    ob_end_clean();

    return $realData;
}

来电示例:

$htmlFile = getHTMLWithDynamicVars(['name' => $name], 'mailContent.html');

答案 2 :(得分:1)

您需要使用模板系统。通过在.php文件中编写HTML,可以使用PHP本身完成模板化:

的template.php:

<html>
<body>
    <p>
        Hi <?= $name ?>,
    </p>
    <p>
        This is an email message.  <?= $someVariable ?>
    </p>
</body>
</html>

使用<?= $variable ?><?php echo $variable ?>添加变量。如果变量来自用户输入,请确保使用htmlspecialchars()正确转义HTML。

然后到程序中的模板,执行以下操作:

$name = 'John Appleseed';
$someVariable = 'Foo Bar';

ob_start();
include('template.php');
$message = ob_get_contents();
ob_end_clean();

$mail->msgHTML($message, dirname(__FILE__));

除了使用PHP进行简单的模板化之外,您还可以使用PHP的模板语言,例如Twig

答案 3 :(得分:0)

在我的一个旧脚本中,我有一个函数可以解析文件中看起来像{{ variableName }}的变量,并将它们替换为数组查找。

function parseVars($emailFile, $vars) {
    $vSearch = preg_match_all('/{{.*?}}/', $emailFile, $vVariables);

    for ($i=0; $i < $vSearch; $i++) {
        $vVariables[0][$i] = str_replace(array('{{', '}}'), NULL, $vVariables[0][$i]);
    }

    if(count($vVariables[0]) == 0) {
        throw new TemplateException("There are no variables to replace.");
    }

    $formattedFile = '';
    foreach ($vVariables[0] as $value) {
        $formattedFile = str_replace('{{'.$value.'}}', $vars[$value], $formattedFile);
    }

    return $formattedFile;
}

答案 4 :(得分:0)

您在发送邮件的同一文件中是否有$name变量?然后你可以用占位符替换它;

__NAME__放在要显示名称的HTML文件中,然后使用str_ireplace('__NAME__', $name, file_get_contents('mailContent.html'))将占位符替换为$name变量。